Delphi DIB mit DIB-Header in TBitmap
Frage
Ich bitte Sie freundlich mir bei diesem Problem zu helfen:
Es gibt ein Byte-Array (data: PByte
), die DIB-Daten und 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;
Wie DIB zu TBitmap konvertieren, während der CPU-Auslastung niedrig zu halten?
Ich habe versucht, http://files.codes -sources.com/fichier.aspx?id=43989&f=GdipApi.pas ohne Erfolg.
Ich habe DIB zu einem Speicher-Stream zugewiesen:
DibMemStream.Clear;
DibMemStream.SetSize(header.image_size);
MoveMemory(DibMemStream.Memory,DibBuffer,header.image_size);
Ich nehme an, es sollte DIB-Header geschrieben irgendwo sein, bevor Bitmap.LoadFromMemoryStream (DibMemStream). Nicht sicher, wo.
Alle Ideen bitte?
Danke!
Lösung
Ich habe das folgende Schema verwendet In-Memory-Bilder zu TBitmap konvertieren:
1) Fill TBMPHeader Struktur
TBMPHeader = packed record
bmfHeader: TBitmapFileHeader;
bmiHeader: TBitmapInfoHeader;
bmiColors: {depends on image format, may be absent};
end;
2) schreiben BMPHeader + Bilddaten Memory
3) Last TBitmap von Memorystream mit TBitmap.LoadFromStream
Sie scheint bmiHeader Struktur bereits gefüllt zu haben. In bmfHeader und (vielleicht) bmiColors.
Hier ist der Code, den ich verwenden 256-Farben-Graustufen im Speicher zu konvertieren Bilder zu TBitmap (vor vielen Jahren, sorry, so dass keine Details):
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;
Andere Tipps
Es ist schon eine lange Zeit, da ich jede Delphi tat Codierung und ich habe nicht in der Lage gewesen, dies zu testen, aber wenn Sie einen Griff in den DIB zur Verfügung stellen können, gibt es eine Funktion - hDIBToTBitmap1 () - das sollte es tun in Link:
http://www.efg2.com/Lab/Library /Delphi/Graphics/LeadToolsConversions.TXT