我很乐意请你帮我解决这个问题:
有一个字节数组(data: PByte
)包含DIB数据和DIBHeader:
TDibHeader = record
size: Cardinal;
width: Integer;
height: Integer;
planes: Word;
bits: Word;
compression: Cardinal;
image_size: Cardinal;
x_res: Integer;
y_res: Integer;
n_colors: Cardinal;
important_colors: Cardinal;
end;
如何在保持CPU使用率低的同时将DIB转换为TBitmap?
我试过http://files.codes-sources.com/fichier.aspx?id=43989&f=GdipApi.pas但没有成功。
我已将DIB分配给内存流:
DibMemStream.Clear;
DibMemStream.SetSize(header.image_size);
MoveMemory(DibMemStream.Memory,DibBuffer,header.image_size);
我想在Bitmap.LoadFromMemoryStream(DibMemStream)之前应该在某处写入DIB头。不知道在哪里。
有什么想法吗?
谢谢!
答案 0 :(得分:3)
我使用以下方案将内存中的图像转换为TBitmap:
1)填写TBMPHeader结构
TBMPHeader = packed record
bmfHeader: TBitmapFileHeader;
bmiHeader: TBitmapInfoHeader;
bmiColors: {depends on image format, may be absent};
end;
2)将BMPHeader +图像数据写入MemoryStream
3)使用TBitmap.LoadFromStream
从MemoryStream加载TBitmap您似乎已经填充了bmiHeader结构。添加bmfHeader和(可能)bmiColors。
以下是我用于将256色灰度级内存中图像转换为TBitmap的代码(很多年前,抱歉,所以没有详细信息):
procedure TksImage.CopyToBitmap(Bitmap: TBitmap);
var
Stream: TStream;
begin
Stream:= TMemoryStream.Create;
try
SaveToStream(Stream);
Stream.Position:= 0;
Bitmap.LoadFromStream(Stream);
finally
Stream.Free;
end;
end;
procedure TksImage.SaveToStream(Stream: TStream);
type
TBMPHeader = packed record
bmfHeader: TBitmapFileHeader;
bmiHeader: TBitmapInfoHeader;
bmiColors: array[0..255] of TRGBQuad;
end;
var
BMPHeader: TBMPHeader;
N: LongWord;
I: Integer;
begin
FillChar(BMPHeader, SizeOf(BMPHeader), 0);
with BMPHeader.bmfHeader do begin
bfType:= $4D42; {'BM'}
bfOffBits:= SizeOf(BMPHeader);
if FChannels = 4 then Dec(bfOffBits, SizeOf(BMPHeader.bmiColors));
bfSize:= bfOffBits + LongWord(FImageSize);
end;
with BMPHeader.bmiHeader do begin
biSize:= SizeOf(BMPHeader.bmiHeader);
biWidth:= FWidth;
biHeight:= FHeight;
biPlanes:= 1;
biBitCount:= 8 * FChannels;
biCompression:= BI_RGB;
biSizeImage:= FImageSize;
{((((biWidth * biBitCount) + 31) and not 31) shr 3) * biHeight;}
end;
N:= 0;
for I:= 0 to 255 do begin
LongWord(bmpHeader.bmiColors[I]):= N;
Inc(N, $010101);
end;
Stream.Write(BMPHeader, BMPHeader.bmfHeader.bfOffBits);
Stream.Write(FImageData^, FImageSize);
end;
答案 1 :(得分:0)
自从我进行任何Delphi编码以来已经很长时间了,但是我无法对此进行测试,但是如果你能提供DIB的句柄,那么就有一个函数 - hDIBToTBitmap1() - 应该可以解决这个问题这个链接:
http://www.efg2.com/Lab/Library/Delphi/Graphics/LeadToolsConversions.TXT