基本支持所有YUV方面的轉(zhuǎn)換.
不過(guò)全部是exe方式的, 如果你打開(kāi)win32目錄的話,支持vs2003和vs2005 ,也支持其他c++編輯器
如果不會(huì)c,那就用下面的方法弄就行了. 呵呵 .
yuv420 轉(zhuǎn)bmp的方法:
我找到了一個(gè)c寫(xiě)的exe ,但是c的水平我實(shí)在是不敢去修改那個(gè)源碼,所以我干脆就調(diào)用這個(gè)dll,在c#里建立了下面這個(gè)類, 然后調(diào)用 Y2b.exe 來(lái)轉(zhuǎn)換, 而且不會(huì)顯示出來(lái)那個(gè)黑屏.要知道怎么回事,就看代碼吧!呵呵.
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路徑,圖片文件夾等. 一般情況下設(shè)置了路徑和圖片文件路徑以及圖片后,應(yīng)該使用屬性取得是否可以執(zhí)行命令.
/// </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文件名, 在成功執(zhí)行轉(zhuǎn)換后可以用此獲得文件路徑..
/// </summary>
/// <returns>返回文件名</returns>
public string GetBmpFileName()
{
return bmpfile;
}
/// <summary>
/// BMP數(shù)據(jù)流,成功轉(zhuǎn)換后可以從此獲得流 .
/// </summary>
/// <returns>數(shù)據(jù)流形式的BMP </returns>
public MemoryStream GetBmpFileStream()
{
try
{
return new MemoryStream(System.IO.File.ReadAllBytes(bmpfile));
}
catch (Exception)
{
return null;
}
}
/// <summary>
/// Image 成功轉(zhuǎn)換后可以用此來(lái)獲得文件.
/// </summary>
/// <returns>返回一個(gè)圖片</returns>
public Image GetBmp()
{
try
{
return Image.FromFile(bmpfile);
}
catch (Exception)
{
return null;
}
}
/// <summary>
/// YUV轉(zhuǎn)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字符開(kāi)始會(huì)有個(gè)OK
{
if (System.IO.File.Exists(yuvfilename.Replace(".yuv", ".bmp")))
{
bmpfile = yuvfilename.Replace(".yuv", ".bmp");
return true;
}
}
}
return false;
}
/// <summary>
/// 執(zhí)行DOS命令.
/// </summary>
/// <param name="canmand">命令</param>
/// <returns>返回執(zhí)行結(jié)果 </returns>
public static string Execute(string yuvfilename)
{
int milliseconds = 2 * 1000;//兩秒
string output = ""; //輸出字符串
if (yuvfilename != null && yuvfilename != "")
{
Process process = new Process(); //創(chuàng)建進(jìn)程對(duì)象
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName =System.Windows.Forms.Application.StartupPath +"//Y2B.exe" ; //設(shè)定需要執(zhí)行的命令
startInfo.Arguments = "/h352 /v288 /""+yuvfilename+"/" /"" +yuvfilename.Replace(".yuv",".bmp"); //設(shè)定參數(shù),其中的“/C”表示執(zhí)行完命令后馬上退出
startInfo.UseShellExecute = false; //不使用系統(tǒng)外殼程序啟動(dòng)
startInfo.RedirectStandardInput = false; //不重定向輸入
startInfo.RedirectStandardOutput = true; //重定向輸出
startInfo.CreateNoWindow = true; //不創(chuàng)建窗口
process.StartInfo = startInfo;
try
{
if (process.Start()) //開(kāi)始進(jìn)程
{
if (milliseconds == 0)
process.WaitForExit(); //這里無(wú)限等待進(jìn)程結(jié)束
else
process.WaitForExit(milliseconds); //這里等待進(jìn)程結(jié)束,等待時(shí)間為指定的毫秒
output = process.StandardOutput.ReadToEnd();//讀取進(jìn)程的輸出
}
}
catch
{
}
finally
{
if (process != null)
process.Close();
}
return output;
}
return null;
}
}
}
描述:
1、讀取akiyo_qcif.yuv YUV420文件,按幀讀取,轉(zhuǎn)RGB,并存儲(chǔ)到BMP文件。 2、暫時(shí)實(shí)現(xiàn)讀取一幀并存儲(chǔ)一張BMP圖片。 若要讀取YUV序列,寫(xiě)成循環(huán)方式即可。 3、生成的BMP文件還有一點(diǎn)小問(wèn)題:圖像的倒立的,而且紅色偏多。 YUV是qcif分辨率。 估計(jì)是YUV到RGB的計(jì)算公式有點(diǎn)問(wèn)題。解決中。。。。 圖像倒立問(wèn)題已經(jīng)解決。紅色不知道是不是公式變換和RGB數(shù)值區(qū)間限制的時(shí)候產(chǎn)生的。估計(jì)和UV的差值方式也有關(guān)系。 紅色的問(wèn)題已經(jīng)解決,采用的變換公式不正確。 但是還是有一些橫紋,不知道是怎么回事。 .
說(shuō)明一下
本程序是由其他程序修改而來(lái),為了避免麻煩,對(duì)其中一些沒(méi)有用的地方并沒(méi)有刪除,但是這樣不會(huì)影響使用。