Was sagt denn die Doku genau zu pImgMem? Ist das schon ein fertiges Bitmap, also mit den erforderlichen Headern, oder der reine Bildbuffer?
Wieviele Bits sind denn pro Bildpunkt vorhanden? 8-, 16-, 24-, 32-Bit? Kennst du die Größe des Buffers in Bytes? In der Regel bei Bitmap wäre das Höhe mal Breite mal 4.
Ist es wirklich unkomprimiertes Material oder muss man das erst einer JPEG-Dekodierung unterziehen?
Hier mal ein kleines Beispiel. Das Array MyBytes, die per Zufall gefüllt wird, entspricht dann deinen Bildbuffer, wo pImgMem drauf zeigt:
Delphi-Quellcode:
var
MyStream: TStream;
MyBitmap: TBitmap;
MyBytes: TBytes;
BitmapSize: Integer;
I: Integer;
BitmapInfo: TBitmapInfo;
BitmapFileHeader: TBitmapFileHeader;
pImgMem: PByte;
BitmapHeight, BitmapWidth: Integer;
begin
BitmapWidth := 1 * 1920;
BitmapHeight := 1 * 1080;
BitmapSize := BitmapWidth * BitmapHeight * 4;
SetLength(MyBytes, BitmapSize);
for I := Low(MyBytes) to High(MyBytes) do
begin
MyBytes[I] := RandomRange(Low(Byte), High(Byte));
end;
FillChar(BitmapInfo, SizeOf(BitmapInfo), 0);
BitmapInfo.bmiHeader.biSize := SizeOf(BitmapInfo.bmiHeader);
BitmapInfo.bmiHeader.biHeight := -BitmapHeight;
BitmapInfo.bmiHeader.biWidth := BitmapWidth;
BitmapInfo.bmiHeader.biPlanes := 1;
BitmapInfo.bmiHeader.biBitCount := 32;
FillChar(BitmapFileHeader, SizeOf(BitmapFileHeader), 0);
BitmapFileHeader.bfType := $4D42;
MyStream := TMemoryStream.Create;
MyStream.Write(BitmapFileHeader, SizeOf(BitmapFileHeader));
MyStream.Write(BitmapInfo, SizeOf(BitmapInfo));
pImgMem := @MyBytes[0];
MyStream.Write(pImgMem^, BitmapSize);
MyStream.Position := 0;
MyBitmap := TBitmap.Create;
MyBitmap.LoadFromStream(MyStream);
ForceDirectories('C:\Test');
MyBitmap.SaveToFile('C:\Test\Test1.bmp');
MyStream.Free;
MyBitmap.Free;
end;