zoukankan      html  css  js  c++  java
  • 图片和视频操作核心代码

    刚上传的排版有点失误,不,应该是有点恶心,我特地下了个Windows Live Writer来专门写博客,现在重新发下

    废话不多说直接上精华。

    下面是图片操作的一些关键代码:

    一、 图片操作类

    需求是得到一些图片的信息存入数据库,其中图片的宽高可通过system.Drawing.Image查看。

    1. 一切从FileInfo开始

    1) OpenFileDialog open = new OpenFileDialog();

    2) if ((bool)open.ShowDialog())

    3) {

    4) //图片文件

    5) FileInfo file = new FileInfo(open.FileName);}

    2. 得到图片(Image):

    #region 静态方法

    /// <summary>

    /// 从图片文件(FileInfo)读取流并生成System.Drawing.Image

    /// </summary>

    /// <param name="file">图片文件(FileInfo)</param>

    /// <returns>Image图片</returns>

    public static Image GetImageFromFileInfo(FileInfo file)

    {

    return Image.FromStream(file.OpenRead());

    }

    注意:WPF里面有个Window.Controls.Image,即控件Image和Window.Drawing.Image,注意区分。

    3. 得到图片缩略图

    1) /// <summary>

    2) /// 得到图片固定大小的缩略图(调用Image.GetThumbnailImage静态方法)

    3) /// </summary>

    4) /// <param name="image">原图</param>

    5) /// <param name="size">缩略图尺寸</param>

    6) /// <returns>固定大小的缩略图</returns>

    7) public static Image getThumbnailImage(Point size,Image image)

    8) {

    9) Bitmap bitmap = new Bitmap(image);

    10) return bitmap.GetThumbnailImage(size.X, size.Y, null, IntPtr.Zero);

    11) }

    12)

    13) /// <summary>

    14) /// 得到图片固定大小的缩略图的二进制数据

    15) /// </summary>

    16) /// <param name="size">原图</param>

    17) /// <param name="size">缩略图尺寸</param>

    18) /// <returns>固定大小的缩略图的二进制</returns>

    19) public static byte[] getByteThumbnailImage(Point size, Image image)

    20) {

    21) Image myImage=getThumbnailImage(size, image);

    22) MemoryStream stream = new MemoryStream();

    23) myImage.Save(stream, myImage.RawFormat);

    24) return stream.ToArray();

    25) }

    注意:得到Byte[]即二进制数据可存入数据库里面去对应的类型是Image(Binary)

    4. 界面上显示

    上面说到过,此时的显示就需要Image控件了,将System.Drawing.Image作为Image控件的图片源

    /// <summary>

    /// 从System.Drawing.Image转换成GDI位图

    /// 调用System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap

    /// 得到System.Windows.Media.ImageSource

    /// </summary>

    /// <param name="image">System.Drawing.Image</param>

    /// <returns>System.Windows.Media.ImageSource</returns>

    public static ImageSource GetImageSourceFromImage(Image image)

    {

    Bitmap bitmap = new Bitmap(image);

    IntPtr hBitmap = bitmap.GetHbitmap();

    return System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(

    hBitmap,

    IntPtr.Zero,

    System.Windows.Int32Rect.Empty,

    BitmapSizeOptions.FromEmptyOptions());

    }

    二.视频处理

    需求:得到视频一些信息存入数据库,有点难度是视频特有属性(FileInfo得不到的),比如视频宽高,视频时长。这里我们借助ffmpeg这个开源免费跨平台的视频和音频流方案。

    这是个很强大的东东啊,不信,你百度看看。下面是我研究了一天得到的,借助这强大的东东完成我想得到的效果,我封装了个类,直接看把。

    #region 字段

    /// <summary>

    /// 视频转换工具的路径

    /// </summary>

    string ffmpeg = AppDomain.CurrentDomain.BaseDirectory + "Resource/Tools/ffmpeg.exe";

    /// <summary>

    /// 提过本地进程访问

    /// </summary>

    Process process;

    #endregion

    #region 属性

    /// <summary>

    /// 是否初始化成功

    /// </summary>

    public bool IsFinishInitial { get; set; }

    /// <summary>

    /// During时长(D)、Width视频宽(W)、视频高(H)的联合字符串

    /// 例子:00:04:32.46x800x600

    /// </summary>

    public string StrDWH { get; set; }

    #endregion

    #region 构造

    public VideoOperation()

    {

    if (!System.IO.File.Exists(ffmpeg))

    {

    //若不存在

    IsFinishInitial = false;

    return;

    }

    //初始化ffmpeg进程

    process = new Process();

    //不启动新窗口

    process.StartInfo.CreateNoWindow = true;

    //不用操作系统shell

    process.StartInfo.UseShellExecute = false;

    //设置启动程序路径

    process.StartInfo.FileName = ffmpeg;

    //初始化成功

    IsFinishInitial = true;

    }

    #endregion

    #region 方法

    /// <summary>

    /// 截取视频截图

    /// 同时异步从视频读取信息During时长(D)、Width视频宽(W)、视频高(H)

    /// 存在字符串StrDWH

    /// </summary>

    /// <param name="fileName">需要截取图片的视频路径</param>

    /// <param name="imgFile">截取图片后保存的图片路径</param>

    /// <param name="imgSize">获取截取图片的大小,默认"100x100"</param>

    public void GetDWHFromVideo(string fileName, string imgFile ,string imgSize="100x100")

    {

    //就看视频

    //获取截图后保存的路径

    string flv_img = imgFile;

    // pss = new Process();

    //设置启动程序的路径

    process.StartInfo.Arguments = " -i \"" + fileName + "\" -y -f image2 -ss 2 -vframes 1 -s " + imgSize + " " + flv_img;

    process.StartInfo.RedirectStandardError = true;//输出信息第一步,基础输出重定向

    DataReceivedEventHandler handler=null;

    process.ErrorDataReceived +=handler= (s, e) =>//输出信息第二步,调用接收到信息时执行的函数

    {

    if (String.IsNullOrEmpty(e.Data)) return;

    string dataReceived = e.Data.Trim();

    if (dataReceived.StartsWith("Duration:"))

    {

    //例子: Duration: 01:56:28.47, start: 0.000000, bitrate: 291 kb/s

    StrDWH = dataReceived.Split(',')[0].Substring(9);

    }

    if (dataReceived.Contains("Video:"))

    {

    //StrDWH += "x"+dataReceived.Split(',')[2].Split('[')[0];

    StrDWH += "x" + dataReceived.Split(',')[2].Trim().Split('[')[0];

    //不在监听数据接收

    process.ErrorDataReceived -= handler;

    }

    };

    //启动

    process.Start();

    process.BeginErrorReadLine();//输出信息第三步,开始执行

    process.WaitForExit();

    }

    #endregion

    顺便写个视频转换方法也贴上好了,

    /// <summary>

    /// 视频格式转换,转换成指定像素尺寸的FLV视频

    /// </summary>

    /// <param name="fileName">原视频</param>

    /// <param name="outPutPath">输出视频</param>

    /// <param name="size">尺寸,不赋值则用原来的</param>

    public void VideoFormatToFLV(string fileName,string outPutPath,string size="")

    {

    //参数:-ab 比特率

    if (string.IsNullOrWhiteSpace(size))

    {

    process.StartInfo.Arguments = " -i " + fileName + " -ab 128 -ar 22050 -qscale 6 -r 29.97 " + outPutPath;

    }

    else

    {

    process.StartInfo.Arguments = " -i " + fileName + " -ab 128 -ar 22050 -qscale 6 -r 29.97 -s " +size+ " " + outPutPath;

    }

    process.Start();

    process.WaitForExit();

    }

    测试代码:

    OpenFileDialog open = new OpenFileDialog();

    if (!(bool)open.ShowDialog())

    { return false; }

    string Name = open.FileName;

    HCAsstesManagerment_Wpf.Models.CommonModels.VideoOperation vo = new Models.CommonModels.VideoOperation();

    if (vo.IsFinishInitial)

    {

    vo.GetDWHFromVideo(Name,System.IO.Path.GetFileNameWithoutExtension(Name)+".jpg");

    MessageBox.Show(vo.StrDWH);

    }

    看截图和得到视频特有参数效果:

    Win7下原视频信息

    clip_image002

    程序得到的,格式是长度x帧宽度x帧高度

    clip_image003

    还有截图:

    clip_image004

    三.总结

    Ok,写的有点多了,你们随便看看当复习把,需要什么自己找好了,不管怎么养也要保证他的完整性么,多是正常的,或许以后我的能力提升了,懂得精华是什么了把,呵呵。

    我测试了我电脑里的视频格式,也算常用格式把,那个程序对大多数格式都支持,像Mp4、wmv、rmvb、avi、flv、mkv、可用,除了qmv这个快播专属不可用。

    最近在做个媒体管理系统,以后有什么好的收获还会继续记下的。

    最后对自己订个目标,一个星期一篇质量博文。盖个邮戳,2012/10/14

  • 相关阅读:
    pro-engineer&UG
    鸡肋
    中国计算机软件设计师考试大纲 2008-10-12 21:51 鹤影314 | 五级
    成为JAVA软件开发工程师要学哪些东西
    爱上一匹野马,可我的家里没有草原,这让我感到绝望。
    理解MySQL——架构与概念
    理解MySQL——索引与优化
    负载均衡与高可用概念(转)
    Nginx Rewrite详解(转)
    Nginx 反向代理配置实例(转)
  • 原文地址:https://www.cnblogs.com/haichao/p/2723517.html
Copyright © 2011-2022 走看看