TBitmap mit Maske aber ohne Transparent Color ..

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1732
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

TBitmap mit Maske aber ohne Transparent Color ..

Beitrag von corpsman »

Hallo Zusammen,

ich möchte hier eine Graphik in eine TPaintBox malen, das macht man Bekanntlich so:

Code: Alles auswählen

var Bmp:TBitmap;
Procedure TForm1.PaintBox1Paint(Sender: TObject);
Begin
  PaintBox1.Canvas.Draw(0, 0, Bmp);
End;
Meine Graphik soll aber "Maskiert" sein, sprich nicht jeder Pixel soll sichtbar sein, sondern nur bestimmte. Die Maske kann man z.B. so erstellen:

Code: Alles auswählen

  // Eine Kreismaske erzeugen, durch indem alle Pixel = clfuchsia zur Maske werden
  bmp.canvas.brush.color := clfuchsia;
  bmp.canvas.rectangle(-1,-1, bmp.width+1, bmp.height+1);
  bmp.canvas.pen.color := clwhite;
  bmp.canvas.brush.color := clwhite;
  bmp.canvas.Ellipse(0,0, bmp.width, bmp.height);
  Bmp.Mask(clfuchsia);

  // Die Maske ist erstellt, ein erneutes Rectangle beschreibt nur die nicht Maskierten Pixel, man sieht also einen Roten Kreis und kein Rotes Rechteck  
  bmp.canvas.pen.color := clred;
  bmp.canvas.brush.color := clred;
  bmp.canvas.rectangle(0,0, bmp.width, bmp.height);  
Das alles Funktioniert wunderbar, nun will ich aber meine Graphik Pixelweise "anpassen" also mache ich folgendes:

Code: Alles auswählen

Var
  intf: TLazIntfImage;
  x, y: Integer;
Begin
  intf := Bmp.CreateIntfImage;
  For x := 0 To Bmp.Width - 1 Do Begin
    For y := 0 To Bmp.Height - 1 Do Begin
        intf.Colors[x, y] := TColorToFPColor(clLime);
    End;
  End;
  Bmp.LoadFromIntfImage(intf); // -- Das Zerstört die vorher erstellte Maske und wir sehen ein Grünes Rechteck und keinen Kreis, wie er in der Maske stand.
  intf.free;
End;                    
Wie im Kommentar schon geschrieben, macht das Bmp.LoadFromIntfImage meine Maske kaputt, die ich vorher gemacht habe.

Mittels bmp.TransparentColor := clfuchsia; und bmp.Transparent := true; kann ich nicht arbeiten, da mein User beliebige Farben eingeben darf und clFuchsia gehört da dazu :(

Was ich auch schon ausprobiert habe, ist mir zu merken wo die maske markiert hat und da dann clDefault hin zu schreiben, aber das wird immer zu schwarz aufgelöst..

Hat einer von Euch eine Idee, wie man das richtig realisieren kann ?
--
Just try it

Antworten