Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   gdi+ 2 TGPBitmap zu einer zusammenfügen (https://www.delphipraxis.net/166507-gdi-2-tgpbitmap-zu-einer-zusammenfuegen.html)

ATS3788 15. Feb 2012 22:08

gdi+ 2 TGPBitmap zu einer zusammenfügen
 
Hallo
Weiss jemand eine Möglichkeit
wie man zwei TGPBitmap zu einer zusammenfügen kann.

Kann auch ein TGPImage sein.

EWeiss 15. Feb 2012 22:22

AW: gdi+ 2 TGPBitmap zu einer zusammenfügen
 
Zitat:

Zitat von ATS3788 (Beitrag 1151298)
Hallo
Weiss jemand eine Möglichkeit
wie man zwei TGPBitmap zu einer zusammenfügen kann.

Kann auch ein TGPImage sein.

JO!
Schau im Source von GDIClock da wird das Dokumentiert. Wenn du damit überlagern meinst!

gruss

ATS3788 16. Feb 2012 10:01

AW: gdi+ 2 TGPBitmap zu einer zusammenfügen
 
Danke habe ich mir mal angeschaut
Interessant, nur ich brauche was um so was wie Bitmap1.height + Bitmap2.height
beide haben die gleiche Breite und das gibt eine neue Bitmap3.

DeddyH 16. Feb 2012 10:04

AW: gdi+ 2 TGPBitmap zu einer zusammenfügen
 
Höhe aus Höhensumme berechnen und dann die beiden Quellbitmaps draufmalen, was ist das Problem?

ATS3788 16. Feb 2012 10:34

AW: gdi+ 2 TGPBitmap zu einer zusammenfügen
 
Delphi-Quellcode:
var
B1 , B2, B3  : TBitmap;
i,x,y : integer;
begin

B1 := TBitmap.Create;
B2 := TBitmap.Create;
B3 := TBitmap.Create;

B1.LoadFromFile('d:\test1.bmp');
B2.LoadFromFile('d:\testX.bmp');


B3.Height := B1.Height + B2.Height;
B3.Width := B1.Width;

for x := 0 to B3.Width -1 do
for y := 0 to B3.Height -1 do begin

if y <= B1.Height then
B3.Canvas.Pixels [x , y ] := B1.Canvas.Pixels [x , y ]
else
B3.Canvas.Pixels [x , y ] := B2.Canvas.Pixels [x , y - B1.Height -1 ];

end;

B3.SaveToFile('d:\testQ.bmp');

 Image2.Picture.Bitmap.Assign(B3);

 B1.Free;
 B2.Free;
 B3.Free;

end;
Habe da mal was zusammengebastelt, aber es geht
auf die Idee hat mich die Seite
http://www.davdata.nl/math/bmresize.html
gebracht. Mal sehen ob ich das noch schneller mit streams bekomme

DeddyH 16. Feb 2012 10:41

AW: gdi+ 2 TGPBitmap zu einer zusammenfügen
 
Wieso nicht einfach mit Delphi-Referenz durchsuchenTCanvas.Draw?

ATS3788 16. Feb 2012 13:56

AW: gdi+ 2 TGPBitmap zu einer zusammenfügen
 
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:29 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz