关闭

yuv420 转bmp的方法

标签: stringexceptionnulloutputexeimage
4977人阅读 评论(2) 收藏 举报
分类:
yuv420 转bmp的方法:
我找到了一个c写的exe ,但是c的水平我实在是不敢去修改那个源码,所以我干脆就调用这个dll,在c#里建立了下面这个类, 然后调用 Y2b.exe 来转换, 而且不会显示出来那个黑屏.要知道怎么回事,就看代码吧!呵呵.


using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using System.Drawing;
using System.IO;

namespace JXImage
{
    public class YUV2BMP
    {
        
  

        /// <summary>
        /// 检查程序配置是否正常, 比如exe路径,图片文件夹等. 一般情况下设置了路径和图片文件路径以及图片后,应该使用属性取得是否可以执行命令.
        /// </summary>
        public bool CanUse
        {
            get
            {
            
                if (System.IO.File.Exists(System.Windows.Forms.Application.StartupPath  + "//Y2B.exe")  )                  
                {
                    
                        return true;

                }

                return false;
            }
        }
      
        private string bmpfile = null;
        /// <summary>
        /// BMP文件名, 在成功执行转换后可以用此获得文件路径..
        /// </summary>
        /// <returns>返回文件名</returns>
        public string GetBmpFileName()
        {
            return bmpfile;
        }
        /// <summary>
        /// BMP数据流,成功转换后可以从此获得流 .
        /// </summary>
        /// <returns>数据流形式的BMP </returns>
        public MemoryStream GetBmpFileStream()
        {
            try
            {
                return new MemoryStream(System.IO.File.ReadAllBytes(bmpfile));
            }
            catch (Exception)
            {

                return null;
            }
        }

        /// <summary>
        /// Image 成功转换后可以用此来获得文件.
        /// </summary>
        /// <returns>返回一个图片</returns>
        public Image GetBmp()
        {
            try
            {
                return Image.FromFile(bmpfile);
            }
            catch (Exception)
            {

                return null;
            }
        }
        /// <summary>
        /// YUV转BMP
        /// </summary>
        /// <param name="yuvfilename">YUV文件名</param>
        /// <returns>返回是否成功</returns>
        public bool YUVtoBMP(string yuvfilename)
        {        
            
            if (CanUse)
            {
                string ret = Execute(yuvfilename);
                if (ret.IndexOf("OK")>=0)//从0字符开始会有个OK
                {
                    if (System.IO.File.Exists(yuvfilename.Replace(".yuv", ".bmp")))
                    {
                        bmpfile = yuvfilename.Replace(".yuv", ".bmp");
                        return true;
                    }
                }
            }
            return false;
        }

        /// <summary>
        /// 执行DOS命令.
        /// </summary>
        /// <param name="canmand">命令</param>
        /// <returns>返回执行结果 </returns>
        public static string Execute(string yuvfilename)
        {
            int milliseconds = 2 * 1000;//两秒
            string output = "";     //输出字符串
            if (yuvfilename != null && yuvfilename != "")
            {
                Process process = new Process();     //创建进程对象
                ProcessStartInfo startInfo = new ProcessStartInfo();
                startInfo.FileName =System.Windows.Forms.Application.StartupPath +"//Y2B.exe" ;      //设定需要执行的命令
                startInfo.Arguments = "/h352 /v288 /""+yuvfilename+"/"   /"" +yuvfilename.Replace(".yuv",".bmp");   //设定参数,其中的“/C”表示执行完命令后马上退出
                startInfo.UseShellExecute = false;     //不使用系统外壳程序启动
                startInfo.RedirectStandardInput = false;   //不重定向输入
                startInfo.RedirectStandardOutput = true;   //重定向输出
                startInfo.CreateNoWindow = true;     //不创建窗口
                process.StartInfo = startInfo;
                try
                {
                    if (process.Start())       //开始进程
                    {
                        if (milliseconds == 0)
                            process.WaitForExit();     //这里无限等待进程结束
                        else
                            process.WaitForExit(milliseconds);  //这里等待进程结束,等待时间为指定的毫秒
                        output = process.StandardOutput.ReadToEnd();//读取进程的输出
                    }
                }
                catch
                {
                }
                finally
                {
                    if (process != null)
                        process.Close();
                }
                return output;
            }
            return null;
        }
    }
}

下载文件 点击下载此文件
如果你要实现更多YUV到BMP的转换,请使用
dirac-0.7.0  sf上可以搜到哦 . google里也可以的. 我就不上传了.
基本支持所有YUV方面的转换.
不过全部是exe方式的, 如果你打开win32目录的话,支持vs2003和vs2005 ,也支持其他c++编辑器
如果不会c,那就用我上面的方法弄就行了. 呵呵 . 
 
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:49304次
    • 积分:923
    • 等级:
    • 排名:千里之外
    • 原创:37篇
    • 转载:6篇
    • 译文:0篇
    • 评论:10条
    最新评论
    我的站点