Hintergrundfarbe bei TImage

Für Fragen von Einsteigern und Programmieranfängern...
hbr
Beiträge: 285
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Hintergrundfarbe bei TImage

Beitrag von hbr »

Hallo Forum,
ich bräuchte etwas Hilfe.
Es gelingt mir nicht einem TImage eine Hintergrundfarbe (TColor) mit folgender Funktion zu übergeben.

Code: Alles auswählen

Function BildAufbau(const x1,y1 :Integer; Bild:TImage):TImage;
Var
   r1,r2:TRect;
   x,y : integer;
Begin
  x := x1; y := y1 ;
  //Zeichne Hintergrundbild in Zwischenspeicher
   r1.Top:=0;
   r1.Left:=0;
   r1.Right:=cImg.Picture.Bitmap.Width;
   r1.Bottom:=cImg.Picture.Bitmap.Height;
   cImg.Canvas.StretchDraw(r1,Back.Picture.Bitmap);
  //Zeichne Vordergrundbild in Zwischenspeicher
     r1.Top:=y;
     r1.Left:=x;
     r1.Right:=x+49;
     r1.Bottom:=y+50;
     r2.Top:=0;
     r2.Left:=0;
     r2.Right:=Bild.Picture.Bitmap.Width;
     r2.Bottom:=Bild.Picture.Bitmap.Height;
     cImg.Canvas.CopyRect(r1,Bild.Picture.Bitmap.Canvas,r2);
   //Kopiere Zwischenspeicher auf Form
      r1.Top:=0;
      r1.Left:=0;
      r1.Right:=MainForm.Width;
      r1.Bottom:=MainForm.Height;
 Result := cImg;
End;  
Das Bild ist ein .png Transparent. Bei einem TImage ohne die Funktion funktioniert es mit „image.color“.
Habe irgendwo gelesen, dass man das mit Canvas machen kann, weis aber nicht wie.

Kann mir hier jemand helfen?

Gruß

Benutzeravatar
six1
Beiträge: 782
Registriert: Do 1. Jul 2010, 19:01

Re: Hintergrundfarbe bei TImage

Beitrag von six1 »

Also, ich werde aus deinem Code nicht schlau und verstehe auch nicht genau, was du durchführen möchtest.

1) du lädst ein *.png in ein TImage.picture
2) du möchtest TImage.picture.bitmap.canvas "einfärben"?

Da gibt es ein cImg und Back... keine Ahnung woher das kommt und in welchem Zusammenhang das steht.
Versuche das bitte nochmal zu erklären, damit ich es verstehen kann...
Gruß, Michael

hbr
Beiträge: 285
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Re: Hintergrundfarbe bei TImage

Beitrag von hbr »

OK in FomCreate ist noch folgendes.

Code: Alles auswählen

  Back:=TImage.Create(Self);         // TImage für Hintergrundbild
  cImg:=TImage.Create(Self);         // Rechtes Bild

  Background:=TImage.Create(Self);
  cImg.Picture.Bitmap.Width:=503;    // Hintergrundbild Göße
  cImg.Picture.Bitmap.Height:=598;

  Background.Picture.Bitmap := BildRechts.Picture.Bitmap;  // Hintergrundbild .PNG
  Back.Picture.Bitmap := Background.Picture.Bitmap;        // in Back sichern  
Das Hintergrundbild hat eine bestimmte Default Größe 503 x 598 und befindet sich in einem TPairSplitterSide auf der Rechten Hälfte.
Zusätzlich werden mit der Funktion 10 kleine Bilder auf das Hintergrundbild platziert.
Back := BildAufbau(213,111,MainForm.L_3); (usw.)
die Bilder ändern sich Stetig je nach Programmverlauf.

Sinn und Zweck ist es, dass beim Verkleinern oder Vergrößern der Form die Bilder an der gleichen Position stehen bleiben und sich mit dem Hintergrundbild bewegen.

Das Funktioniert auch, nur mit einem PNG Transparent – Bild bleibt der Hintergund eben Schwarz.

Links befindet sich ein Bild in einem TImage (Stretch true)

Ich hoffe das ist so Einigermaßen verständlich.

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Hintergrundfarbe bei TImage

Beitrag von Winni »

Hi!

Wenn Du eine PNG-Datei in eine Bitmap lädst, dann wird das Transparente schwarz.

Versuch das mal mit

Code: Alles auswählen

Image1.Picture.PNG.LoadFromFile( )
oder

Code: Alles auswählen

Image1.Picture.PNG.LoadFromStream( )
Winni

hbr
Beiträge: 285
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Re: Hintergrundfarbe bei TImage

Beitrag von hbr »

Wie ich schon geschrieben habe, funktioniert das gleich auf der linken Seite.
Ebenfalls ein transparentes PNG Hintergrundbild.

Nur bei der Funktion die mehrere Bilder zusammenfügt ist keine Hintergrundfarbe tcolor enthalte bzw. zu sehen.

Mir fehlt also, eventuell mit canvas, das zeichnen der Hintergrundfarbe, nur weis ich nicht wie.

Benutzeravatar
six1
Beiträge: 782
Registriert: Do 1. Jul 2010, 19:01

Re: Hintergrundfarbe bei TImage

Beitrag von six1 »

Die Hintergrundfarbe von TImage.Picture.Bitmap.Canvas zeichnest du, indem du ein Canvas.Rect in voller Größe der Bitmap zeichnest.
Vorher die Zeichenfarbe mit TImage.Picture.Bitmap.Canvas.Brush.Color festlegen und die Transparenz.
Alles in allem so:

TImage.picture.Bitmap.Width:=TImage.Width;
TImage.picture.Bitmap.Height:=TImage.Height;
TImage.picture.Bitmap.TransparentColor:=clwhite;
TImage.picture.Bitmap.TransparentMode:=tmFixed;
TImage.picture.Bitmap.Canvas.Brush.Style:=bsClear;
TImage.picture.Bitmap.Canvas.Brush.Color:=TImage.picture.Bitmap.TransparentColor;
TImage.picture.Bitmap.Canvas.Rectangle(0,0,TImage.Width,TImage.Height);

Danach hast du ein durchsichtiges TImage und kannst über
TImage.Canvas.StretchDraw(ARect, TImage_2.Picture.Bitmap);
TImage.Transparent:=false;
TImage.Transparent:=true;
andere Bilder transparent in das Image einfügen.
Gruß, Michael

hbr
Beiträge: 285
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Re: Hintergrundfarbe bei TImage

Beitrag von hbr »

Danke für die Info.
Warum beim zusätzlichem einfügen eines images erst
TImage.Transparent:=false;
Und dann
TImage.Transparent:=true;
Ausführen und das hintereinander?

Benutzeravatar
six1
Beiträge: 782
Registriert: Do 1. Jul 2010, 19:01

Re: Hintergrundfarbe bei TImage

Beitrag von six1 »

wenn es bei dir funktioniert, die Transparenz anfangs einzustellen, brauchst du es nicht.
Durch Ein- und Ausschalten der Transparenz wird ein Neuzeichnen erzwungen.
Gruß, Michael

hbr
Beiträge: 285
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Re: Hintergrundfarbe bei TImage

Beitrag von hbr »

Hallo,
leider Funktioniert Deine Vorschlag nicht,
six1 hat geschrieben:
Sa 16. Jan 2021, 09:07
Die Hintergrundfarbe von TImage.Picture.Bitmap.Canvas zeichnest du, indem du ein Canvas.Rect in voller Größe der Bitmap zeichnest.
Vorher die Zeichenfarbe mit TImage.Picture.Bitmap.Canvas.Brush.Color festlegen und die Transparenz.
Alles in allem so:

TImage.picture.Bitmap.Width:=TImage.Width;
TImage.picture.Bitmap.Height:=TImage.Height;
TImage.picture.Bitmap.TransparentColor:=clwhite;
TImage.picture.Bitmap.TransparentMode:=tmFixed;
TImage.picture.Bitmap.Canvas.Brush.Style:=bsClear;
TImage.picture.Bitmap.Canvas.Brush.Color:=TImage.picture.Bitmap.TransparentColor;
TImage.picture.Bitmap.Canvas.Rectangle(0,0,TImage.Width,TImage.Height);

Danach hast du ein durchsichtiges TImage und kannst über
TImage.Canvas.StretchDraw(ARect, TImage_2.Picture.Bitmap);
TImage.Transparent:=false;
TImage.Transparent:=true;
andere Bilder transparent in das Image einfügen.
Ich habe folgendes gemacht.

Code: Alles auswählen

Function BildBbau(FormTImage, HintergrundFarbe : TImage; Farbe: TColor):Timage;
Var
   r1 : TRect;
Begin
  HintergrundFarbe.Picture.Bitmap.Canvas.Brush.Color := Farbe;

  HintergrundFarbe.picture.Bitmap.Width := FormTImage.Width;
  HintergrundFarbe.picture.Bitmap.Height := FormTImage.Height;
  HintergrundFarbe.picture.Bitmap.TransparentColor := clwhite;
  HintergrundFarbe.picture.Bitmap.TransparentMode := tmFixed;
  HintergrundFarbe.picture.Bitmap.Canvas.Brush.Style := bsClear;
  HintergrundFarbe.picture.Bitmap.Canvas.Brush.Color := HintergrundFarbe.picture.Bitmap.TransparentColor;
  HintergrundFarbe.picture.Bitmap.Canvas.Rectangle(0, 0, FormTImage.Width, FormTImage.Height);

  r1.Top := 0;
  r1.Left := 0;
  r1.Right := FormTImage.Picture.Bitmap.Width;
  r1.Bottom := FormTImage.Picture.Bitmap.Height;

  HintergrundFarbe.Canvas.StretchDraw(r1, FormTImage.Picture.Bitmap);
  HintergrundFarbe.Transparent := false;
  HintergrundFarbe.Transparent := true;

  Result := HintergrundFarbe;
End;  


Aufruf:
Image1 := BildBbau(Image1, BildHgFarbe, clRed);

Image1 ist das Form-Timage mit geladenem .png Transparent.

Leider ändert sich die Farbe nicht.

hbr
Beiträge: 285
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Re: Hintergrundfarbe bei TImage

Beitrag von hbr »

Habe ich etwas falsch gemacht?
Es funktionierte einfach nicht.
Oder liegt es an Lazarus?

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Hintergrundfarbe bei TImage

Beitrag von theo »

Die Alpha-Transparenz eines PNG hat afaik mit den Transparent* Eigenschaften (Bit Maske) nichts zu tun.

Bei mir (Lazarus 2.1.0 r64335M FPC 3.2.0 x86_64-linux-gtk2) geht folgendes problemlos.
Testbild von hier: https://upload.wikimedia.org/wikipedia/ ... tion_1.png

Code: Alles auswählen

procedure BildBbau(FormTImage, HintergrundFarbe : TImage; Farbe: TColor);
Var
   r1 : TRect;
Begin
  HintergrundFarbe.picture.Bitmap.Width := FormTImage.Width;
  HintergrundFarbe.picture.Bitmap.Height := FormTImage.Height;
  HintergrundFarbe.picture.Bitmap.Canvas.Brush.Style := bsSolid;
  HintergrundFarbe.Picture.Bitmap.Canvas.Brush.Color := Farbe;
  HintergrundFarbe.picture.Bitmap.Canvas.FillRect(0, 0, FormTImage.Width, FormTImage.Height);
  r1.Top := 0;
  r1.Left := 0;
  r1.Right := FormTImage.Picture.Bitmap.Width;
  r1.Bottom := FormTImage.Picture.Bitmap.Height;
  HintergrundFarbe.Canvas.StretchDraw(r1, FormTImage.Picture.Bitmap);
End;    

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Hintergrundfarbe bei TImage

Beitrag von Winni »

Hi!

Ja die Bit-Mask ist nur für Image-Formate ohne Alpha-Kanal zuständig - typischerweise der TBitmap.

PNG bringen ihren eigenen Alpha-Kanal mit und reagieren nicht auf die "Transparent Color".
Diese ist sowieso nur ein übles Hilfskonstrukt, das von Windows entwendet wurde. M$ hat nämlich den Alpha-Kanal vergessen. Statt dessen haben sie das 4. Farb-Byte für ihre unsäglichen "system colors"verwendet, die normalerweise nur Ärger machen.

Winni

hbr
Beiträge: 285
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Re: Hintergrundfarbe bei TImage

Beitrag von hbr »

theo hat geschrieben:
Mo 1. Feb 2021, 14:06
Die Alpha-Transparenz eines PNG hat afaik mit den Transparent* Eigenschaften (Bit Maske) nichts zu tun.
....
Danke,
aber was bedeutet die Aussage mit Apha-Transparenz?

Übrigens unter Windows läuft es so nicht.
Ich habe jetzt 2.1.0 installiert, das gleiche Ergebnis wie in 2.0.10 und 2.0.11.

Oder ich mache etwas falsch.
In FormCeate:
BildHgFarbe := TImage.Create(Self);
TImage für die Farbfüllung erzeugen und die
beiden TImages mit geladenem Bild einschließlich der Farbe übergeben.
BildBbau(Image1, BildHgFarbe, clRed);

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Hintergrundfarbe bei TImage

Beitrag von theo »

hbr hat geschrieben:
Mo 1. Feb 2021, 22:26
aber was bedeutet die Aussage mit Apha-Transparenz?
Kannst du hier nachlesen: https://de.wikipedia.org/wiki/Alphakanal

Im Ggs. dazu, beziehen sich die Eigenschaften TransparentMode, TransparentColor auf einer Art Maske oder Schablone, die quasi über das Bild gelegt wird. Das Bild "verschmilzt" so nicht mit dem Hintergrund sondern hebt sich ggf. pixelig ab.
Alphakanal ist also besser.

Hast du es denn mit dem Testbild versucht, welches ich oben verlinkt habe?

hbr
Beiträge: 285
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Re: Hintergrundfarbe bei TImage

Beitrag von hbr »

Ja selbstverständlich.
Keine Funktion.

Antworten