![]() |
Farben anhand einer Maske invertieren.
Ich habe folgende Bilder:
Bild1: ![]() Bild2: ![]() Nun möchte ich dieses in ein Bild1 so in Bild2 einbauen, so dass bei Bild2 die "überschriebenen" Pixel abhängig vom Weiß-Anteil (oder schwarz) der entsprechenden Pixel von Bild1 invertiert werden. Also so: ![]() Ist so etwas überhaupt möglich und wenn ja wie? |
Re: Farben anhand einer Maske invertieren.
Klar ist das möglich....
du musst dir nur die entsprechenden werte aus den dateien holen. Wenn invertieren so geht: component := 255 - component (für alle drei kompoenenten eines pixels) und dein graustufenwert, mit dem du es verrechnen willst, "wert" ist, kannst du es so blenden: component := (component * wert + (255 - component) * (255-wert)) div 255; Natürlichz für alle drei farbkomponenten jeden pixels. EDIT:
Delphi-Quellcode:
Bringt exzellente Ergebnisse. Das ganze zu abstrahieren und von Canvas.Pixels auf Scanline umzusteigen, sollte auch kein problem sein.
procedure TForm2.BlendImages;
var b1: TBitmap; b2: TBitmap; b3: TBitmap; i: Integer; k: Integer; p1: Cardinal; p2: Cardinal; a: Byte; r: Byte; g: Byte; b: Byte; begin if not (Image1.Picture.Bitmap.Empty or Image2.Picture.Bitmap.Empty) then begin b1 := Image1.Picture.Bitmap; b2 := Image2.Picture.Bitmap; b3 := TBitmap.Create; b3.SetSize(Image1.Picture.Width,Image1.Picture.Width); for i := 0 to Min(b1.Width, b2.Width) - 1 do for k := 0 to Min(b1.Height, b2.Height) - 1 do begin p1 := b1.Canvas.Pixels[i, k]; p2 := b2.Canvas.Pixels[i, k]; a := GetRValue(p2); r := GetRValue(p1); r := (r * (255 - a) + (255 - r) * a) div 255; g := GetGValue(p1); g := (g * (255 - a) + (255 - g) * a) div 255; b := GetBValue(p1); b := (b * (255 - a) + (255 - b) * a) div 255; b3.Canvas.Pixels[i, k] := RGB(r, g, b); end; Image1.Picture.Bitmap.Assign(b3); b3.Free; end; end; |
Re: Farben anhand einer Maske invertieren.
Liste der Anhänge anzeigen (Anzahl: 1)
Also mit
Delphi-Quellcode:
habe ich den gewünschten Effekt erreicht. Allerdings scheint dies nur zu funktionieren, wenn der Hintergrund Unifarben ist.
Canvas.CopyMode = cmSrcInvert;
Meine Absicht, dieses bei einem Hintergrund mit Farbverlauf zu verwenden bringt mir den Effekt, der im Anhang zu sehen ist. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:25 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz