yuv422转换为BMP ( 积分: 100 )

  • 主题发起人 主题发起人 appfirst
  • 开始时间 开始时间
A

appfirst

Unregistered / Unconfirmed
GUEST, unregistred user!
我使用一个方法转换了图像,但效果不是很理想,那位大侠有代码,不胜感激,急啊!

red]help~help![:(][/red]
 
我使用一个方法转换了图像,但效果不是很理想,那位大侠有代码,不胜感激,急啊!

red]help~help![:(][/red]
 
转换的结果图像的色彩有变化,不知道是什么的问题,请了解的朋友指教一下,谢谢
 
我贴一段代码:
Function YUV422ToBmp(Width,Height:Integer; inBuf:Pointer):TBitmap;
Const
PixelCountMax = 32768;

Type
pRGBTripleArray = ^TRGBTripleArray;
TRGBTripleArray = ARRAY[0..PixelCountMax-1] OF TRGBTriple;

TArrayInteger=Array of Integer;
TArrayByte=Array of Byte;
Var
YBufferSize, UVBufferSize:Integer;
YBuffer,UBuffer,VBuffer:TArrayByte;

ULine,VLine:TArrayInteger;
R, G, B:Integer;
Y, U, V:Integer;
Line:Integer;
First,Last:Integer;
UVIndex, pixel:Integer;
YIndex,RGBIndex:Integer;
Row: pRGBTripleArray;

Function CheckValue(Value:SmallInt):Byte;
begin
if Value<0 then
begin
Result:=0;
end
else
begin
if Value>255 then
Result:=255
else
Result:=R;
end;

// Result:=255-Result;
end;
begin
Result:= TBitmap.Create;
Result.PixelFormat := pf24bit;
Result.Width := Width;
Result.Height := Height;

//Allocate memory for input and output buffers.
YBufferSize := height*width;
SetLength(YBuffer,YBufferSize);

UVBufferSize := (height*width) div 2;
SetLength(UBuffer,UVBufferSize);
SetLength(VBuffer,UVBufferSize);

SetLength(ULine,width+2);
SetLength(VLine,width+2);

ZeroMemory(ULine, SizeOf(Integer)*(width+2));
ZeroMemory(VLine, SizeOf(Integer)*(width+2));

Try

//Read frames of Y then U then V components
MoveMemory(YBuffer,inBuf,YBufferSize);
inBuf:=PChar(inBuf)+YBufferSize;

MoveMemory(UBuffer,inBuf,UVBufferSize);
inBuf:=PChar(inBuf)+UVBufferSize;

MoveMemory(VBuffer,inBuf,UVBufferSize);
inBuf:=PChar(inBuf)+UVBufferSize;

for Line:=0 to Height-1 do
begin

UVIndex := (width*line) div 2;
pixel:=0;
While pixel<width do
begin
//Copy (sub-sampled) UV components to line buffer.
ULine[pixel] := UBuffer[UVIndex]-128;
VLine[pixel] := VBuffer[UVIndex]-128;
Inc(UVIndex);
Inc(pixel,2);
end;

YIndex := width*line;
RGBIndex := 3*width*line;
Row := Result.Scanline[Line];
for pixel:=0 to width-1 do
begin

//Copy Y value and filter UV values.
{
Y:=YBuffer[YIndex];
U:=ULine[pixel];
V:=VLine[pixel];

R:=Round(Y+1.371*(V-128));
G:=Round(Y-0.698*(V-128)-0.336*(U-128));
B:=Round(Y+1.732*(U-128));
}

Y := YBuffer[YIndex] - 16;
Inc(YIndex);
if pixel=0 then
begin
First := 0;
end
else
begin
First := ULine[pixel-1];
end;

if pixel=Width-1 then
Last:=0
else
Last:=VLine[pixel+1];
U := (First+2*ULine[pixel]+Last+1) shr 1;
V := (First+2*VLine[pixel]+Last+1) shr 1;

// Matrix YUV to RGB
R := (298*Y+409*V+128) shr 8;
G := (298*Y-100*U-208*V + 128) shr 8;
B := (298*Y+516*U+128) shr 8;


With Row[pixel] do
begin
rgbtRed := CheckValue(R);
rgbtGreen := CheckValue(G);
rgbtBlue := CheckValue(B);
end;
end;
end;

Finally
SetLength(VLine,0);
SetLength(ULine,0);
SetLength(VBuffer,0);
SetLength(UBuffer,0);
SetLength(YBuffer,0);
end;
end;
 
以上的代码已经可以转换图像,但色度有问题,我的YUV422图像来源于海康的H卡,不知是什么问题!
 
你用“GraphicEx9.9图像控件”吧,网上有,带原代码的,
支持:
从http://www.lischke-online.de/GraphicEx.php当下来的。

可以用它来开发查看图形文件。

可以打开:
1。TIFF 图像 (*.tif; *.tiff), extended base line implementation
每个采样点1到16 bits;
支持indexed索引色、 grayscale灰度色、 RGB(A)真彩色、 CMYK及 L*a*b*
支持未压缩格式、压缩格式、LZW、 CCITT T.4、 Thunderscan、 Deflate及新的JPEG格式
2。GFI fax 图像 (*.fax), 使用TTIFFGraphic进行查看
3。SGI 图像 (*.bw, *.rgb, *.rgba, *.sgi)
每个采样点1到16 bits;
支持indexed索引色、 grayscale灰度色、 RGB(A)真彩色
支持未压缩格式、 RLE
4。Autodesk 图像 files (*.cel; *.pic) (就比较老的格式)
每个采样点8bits,支持indexed索引色、支持未压缩格式
5。Truevision 图像 (*.tga; *.vst; *.icb; *.vda; *.win), 支持这种格式的读写
每个采样点5到8 bits;
grayscale灰度色、支持indexed索引色、 15 bits RGB(555), 24 bits RGB(A)(888)
支持未压缩格式、 RLE
6。ZSoft Paintbrush 图像 (*.pcx, *.pcc; *.scr)
每个采样点1到8 bits;
支持indexed索引色、 grayscale灰度色、 RGB真彩色
支持未压缩格式、 RLE
7。Kodak Photo-CD 图像 (*.pcd)
每个采样点8bits,采用YCbCr格式,分辨率(192 x 128 到6144 x 4096)
8。Portable pixel/gray map 图像 (*.ppm, *.pgm, *.pbm)
每个采样点1到8 bits;
支持indexed索引色、 grayscale灰度色、 RGB真彩色、未压缩格式。
9。Dr. Halo 图像 (*.cut, *.pal)
每个采样点8bits,带索引、采用RLE压缩
10。CompuServe 图像 (*.gif)
每个采样点1、4或8bits,带索引、采用LZW压缩
11。SGI Alias/Wavefront 图像 (*.rla, *.rpf)
每个采样点8bits,RGB(A)真彩色、采用RLE压缩
12。标准Windows位图(*.bmp, *.rle, *.dib)
13。Photoshop 图像 (*.psd, *.pdd)
每个采样点1、8或16 bits
支持indexed索引、RGB、CMYK、CIE L*a*b*
未压缩格式、位压缩格式
14。Paintshop Pro 图像 (*.psp)
每个采样点1、4或8bits,
支持indexed索引色、 grayscale灰度色、 RGB真彩色
支持未压缩格式、RLE和LZ77
单独分层的文件
15。Portable network graphic 图像 (*.png)
每个采样点1、2、4、8或16 bits,
支持indexed索引、grayscale alpha、RGB(A)及LZ77压缩格式
 
兄弟,我是要实现YUV422到BMP的转换
 
我也想知道有好方法吗?
 
不知做采集的朋友是否可以支持一下?
 
海康的H卡YUV422格式是:先Y(大小:宽*高)+U((大小:(宽*高)div 2))+V((大小:(宽*高)div 2))这样才对,YUV不是放在一块的,先把Y全部放进去然后再放U再放V
你按照这样的方法才能转出来。转换函数我就不发了,很简单的。
 
我用过海康的卡,没有问题。
 
后退
顶部