Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Farben anhand einer Maske invertieren. (https://www.delphipraxis.net/79770-farben-anhand-einer-maske-invertieren.html)

DevilsCamp 27. Okt 2006 20:24


Farben anhand einer Maske invertieren.
 
Ich habe folgende Bilder:

Bild1:
http://www.myrasmussen.de/bilder/dpraxis/kreis.png

Bild2:
http://www.myrasmussen.de/bilder/dpr...intergrund.png


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:
http://www.myrasmussen.de/bilder/dpraxis/ergebnis.png


Ist so etwas überhaupt möglich und wenn ja wie?

DGL-luke 27. Okt 2006 20:52

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:
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;
Bringt exzellente Ergebnisse. Das ganze zu abstrahieren und von Canvas.Pixels auf Scanline umzusteigen, sollte auch kein problem sein.

DevilsCamp 27. Okt 2006 21:46

Re: Farben anhand einer Maske invertieren.
 
Liste der Anhänge anzeigen (Anzahl: 1)
Also mit
Delphi-Quellcode:
Canvas.CopyMode = cmSrcInvert;
habe ich den gewünschten Effekt erreicht. Allerdings scheint dies nur zu funktionieren, wenn der Hintergrund Unifarben ist.
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