Delphi-Quellcode:
function AddBitmapInHeight(B1, B2 : TBitmap) : TBitmap;
type
TBitmapHeader = packed Record
bitCH1 : AnsiChar;
bitCH2 : AnsiChar;
bitSize : cardinal;
bitUnUsed1 : word;
bitUnUsed2 : word;
bitOffset : Cardinal;
bitInfoHeader : Cardinal;
bitwidth : integer;
bitheight : integer;
bitplanes : word;
bitNuOfPix : word;
bitCompression : Cardinal;
bitSizeImage : Cardinal;
bitXPixMeter : integer;
bitYPixMeter : integer;
bitColorsUsed : Cardinal;
bitImportantColors : Cardinal;
end;
PBitmapHeader = ^TBitmapHeader;
var
ms1 , ms2 : TMemoryStream;
Buffer1, Buffer2 : pointer;
BInfo : TBITMAPINFO;
PBH : PBitmapHeader;
begin
try
ms1 := TMemoryStream.Create;
try
ms2 := TMemoryStream.Create;
B1.SaveToStream(ms1); // Bitmap 1 in den Stream 1
B2.SaveToStream(ms2); // Bitmap 2 in den Stream 2
try
GetMem(Buffer1 , ms1.Size + 1);
FillChar(Buffer1^ , SizeOf(Buffer1) , #0);
PBH := Buffer1; // Bitmap Header auf den Buffer der ersten Bitmap
try
GetMem(Buffer2 , ms2.Size + 1);
FillChar(Buffer2^ , SizeOf(Buffer2) , #0);
ms1.Position := 0; // Auf den Anfan des Stream - Wichtig !
ms1.ReadBuffer(Buffer1^ , ms1.Size); //Stream1 in den Buffer 1 schreiben
PBH^.bitSize := ms1.Size + ms2.Size - 54; // Neue Header Info Grösse in den Buffer 1 schreiben
PBH^.bitheight := B1.Height + B2.Height; // das gleiche mit der Höhe
ms2.Position := 54; // Position ohne den Heder von Bitmap 2
ms2.ReadBuffer(Buffer2^ , ms2.Size -54);// und inden den Buffer 2
ms1.Position := 0;
ms1.WriteBuffer(Buffer1^, ms1.Size);
ms1.SetSize(ms1.Size + ms2.Size);
// Neue grösse der Bitmap in den Stream setzen
ms1.WriteBuffer(Buffer2^, ms2.Size);
ms1.Position := 0;
Result := TBitmap.Create;
Result.LoadFromStream(ms1);
finally
FreeMem(Buffer2);
end;
finally
FreeMem(Buffer1);
end;
finally
ms2.Free;
end;
finally
ms1.Free;
end;
end;
und so geht es echt schnell.
DaddyH warum nicht mit draw gute frage.
ich hatte es so im kopf durch das clock beispiel
und ich wusste da kommt noch was mit streams