Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Addition von Bitmaps (https://www.delphipraxis.net/28152-addition-von-bitmaps.html)

alfred 20. Aug 2004 09:21


Addition von Bitmaps
 
Hi Leute,

wer kennt sich mit Bildverarbeitung aus ? Ich habe folgendes Problem :
Zur Laufzeit soll ein Bild erstellt werden, das aus mehreren Einzelbildern zusammengesetzt werden soll. Es wird ein Ausgangsbild geladen, das nicht transparent ist. Darüber sollen transparente Bilder gelegt werden, so dass am Ende ein neues Bild entsteht, das gewissermaßen die Summe der Einzelbilder darstellt und das anschließend als neues Bild temporär gespeichert werden soll. Annahme : alle Bilder besitzen gleiche Formate (bmp), Größen und Auflösungen. Gibt es irgendwas, was man benutzen könnte, oder hat jemand eine geniale Idee ?
Wenn Größe und Auflösung gleich sind, dann sollte auch die Anzahl der Pixel gleich sein. Unter der Vorgabe, dass bei den Bildern, die ausschließlich zur Komplettierung dienen, nur die relevanten Pixel nicht Weiß sind ( Weiß = Transparentfarbe ), sollte es doch möglich sein, alle Farbcodes, die von Weiß verschieden sind, aus einem Bild heraus zu lesen und diese auf das Basisbild zu übertragen. Das ist zumindest ein theoretischer Ansatz. Bleiben nur die Fragen - ist dieser Ansatz praktikabel und wie liest man die Farbcodes der einzelnen Pixel bzw. wie können diese geändert werden ?

Ich bin für jede Anregung dankbar.

Gruß alfred :witch:

Dannyboy 20. Aug 2004 11:23

Re: Addition von Bitmaps
 
Hallo Alfred,
Hier im Forum suchenScanLine benötigst Du auf jeden Fall, um die Pixel Deines Bitmaps
zu ändern. Dabei musst Du darauf achten, dass das Pixelformat
richtig gewählt ist. Am besten, Du schaust Du das Bsp. in der Delphi-
Hilfe zu Scanline mal an.

Genau betrachtet möchtest Du nicht die Summe von Bildern bilden, sondern
den Durchschnitt. Würde man die einzelnen Farbpartikel von Bildern
addieren, so wäre das Ergebnis irgendwann ein weisses Bild.

Die Sache mit den überlappenden Bildern musst Du selbst ausrechnen, also
da gibt es zumindest meines Wissens keine Funktion für.
Du schnappst Dir mit Scanline eine Zeile von Pixeln und dann würde
ich das für jeden Pixel ganz spontan folgendermaßen machen:

Du unterteilst die Pixel in deren RGB-Bytes (entweder selbst shiften
oder die Funktionen in der Windows.pas verwenden). O.k., Du hast
nun also red1, green1, blue1 von einem Pixel des unteren Bildes.
Du schnappst Dir nun den Pixel an der gleichen Position des obereren,
überlappenden Bildes, und kriegst red2, green2 und blue2.
Nun hast Du also 2 Pixel, aus denen Du ein Mittelmaß errechnen möchtest.
am besten á al:
Delphi-Quellcode:
var redNeu, greenNeu, blueNeu : word; // byte würde nicht funktionieren !
redNeu:= (red1 + red2) div 2;
greenNeu:= (green1 + green2) div 2;
blueNeu:= (blue1 + blue2) div 2;
Dies tust Du für jeden Pixel des Bildes.

Nikolas 20. Aug 2004 11:30

Re: Addition von Bitmaps
 
Was dir helfen wird, alles ausser dem weiß zu kopieren: Delphi-Referenz durchsuchenTCanvas.Brushcopy und Delphi-Referenz durchsuchenTCanvas.CopyRect

alfred 20. Aug 2004 11:44

Re: Addition von Bitmaps
 
Hallo Dannyboy,

vielen Dank für die ausführliche Erläuterung. Das hilft mir doch schon mal weiter.

Gruß alfred

Phantom1 20. Aug 2004 11:45

Re: Addition von Bitmaps
 
Soweit ich das verstanden habe will er ein bild über das andere legen ohne dabei die farben zu mischen.

Ich habe eben mal schnell eine function geschrieben:

Delphi-Quellcode:
Function MergeBitmaps(Src1, Src2, Dest: TBitmap; MaskColor: TColor): Boolean;
Var
  w, h, x: Integer;
  s2, d: PInteger;
Begin
  Result:=False;
  If Not (Assigned(Src1) or Assigned(Src2) or Assigned(Dest)) Then Exit;
  w:=Src1.Width;
  h:=Src1.Height;
  If (w<>Src2.Width) or (h<>Src2.Height) Then Exit;
  Src1.PixelFormat:=pf32Bit;
  Src2.PixelFormat:=pf32Bit;
  Dest.Assign(Src1);
  s2:=Src2.ScanLine[h-1];
  d:=Dest.ScanLine[h-1];
  For x:=1 To w*h Do Begin
    If s2^<>MaskColor Then d^:=s2^;
    Inc(s2);
    Inc(d);
  End;
  Result:=True;
End;
aufgerufen werden kann es zum Beispiel so hier:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
Var Src1, Src2, Dest: TBitmap;
begin
  Src1:=TBitmap.Create;
  Src2:=TBitmap.Create;
  Dest:=TBitmap.Create;
  Try
    Src1.LoadFromFile('D:\1.bmp');
    Src2.LoadFromFile('D:\2.bmp');
    If MergeBitmaps(Src1, Src2, Dest, clWhite) Then
      Image1.Picture.Bitmap.Assign(Dest);
  Finally
    FreeAndNil(Src1);
    FreeAndNil(Src2);
    FreeAndNil(Dest);
  End;
end;

alfred 20. Aug 2004 11:58

Re: Addition von Bitmaps
 
Hi Phantom1,

das sieht schon sehr gut aus. Ich werde das mal checken.
Super - vielen Dank für die Hilfe.

Gruß alfred :witch:


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:38 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