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: |
Re: Addition von Bitmaps
Hallo Alfred,
ScanLine 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:
Dies tust Du für jeden Pixel des Bildes.
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; |
Re: Addition von Bitmaps
Was dir helfen wird, alles ausser dem weiß zu kopieren: TCanvas.Brushcopy und TCanvas.CopyRect
|
Re: Addition von Bitmaps
Hallo Dannyboy,
vielen Dank für die ausführliche Erläuterung. Das hilft mir doch schon mal weiter. Gruß alfred |
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:
aufgerufen werden kann es zum Beispiel so hier:
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;
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; |
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