Entwickler-Ecke

Multimedia / Grafik - TPicture Transparenz


ferra - Mo 24.01.11 20:31
Titel: TPicture Transparenz
Guten Abend,

kann mir jemand erklären, ob es möglich ist, eine bestimmte Farbe eines Pictures transparent zu setzen?

Ich habe nämlich mehrere Grafiken welche ich normal lade:

Delphi-Quelltext
1:
2:
  held_oben1 := TPicture.Create;
  held_oben1.LoadFromFile('source\grafiken\figuren\held\held_oben1.jpg');


und anschließend mit einigen anderen Bildern in ein Bitmap zeichne:

Delphi-Quelltext
1:
buffer.Canvas.Draw(x_positionHeld, y_positionHeld, held_links2.Graphic);                    


Nun möchte ich aber, dass eine bestimmte Farbe bei der Grafik 'held_oben1.jpg' transparent wird (in diesem Falle grün), sodas an dieser Stelle der Hintergrund zu sehen ist, welcher zuvor ebenfalls in das BitMap gezeichnet wurde.

Kann mir jemand einen Lösungsansatz geben?

MfG ferra


bummi - Mo 24.01.11 21:23

JPEG ist etwas ungüstig, da Du da immer Klötzchen bekommen wirst, aber ansonsten...



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
Procedure DrawTransparent(DestCanvas:TCanvas;Graphic:TGraphic;Color:TColor);
var
  bmp:TBitmap;
begin
 bmp:=TBitmap.Create;
 try
 bmp.Width := Graphic.Width;
 bmp.Height := Graphic.Height;
 bmp.Canvas.Draw(0,0,Graphic);
 bmp.TransparentColor := Color;
 bmp.Transparent := true;
 DestCanvas.Draw(0,0,bmp);
 finally
 bmp.Free;
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 image1.Picture.LoadFromFile('C:\bilder\h2o.jpg');
 DrawTransparent( Canvas, Image1.Picture.Graphic, clWhite);
end;


delfiphan - Mo 24.01.11 22:07

Besser ist es, wenn du mit einem Format arbeitest, das Alpha-Transparenz unterstützt (z.B. PNG). Alternativ eignen sich auch Vektorgraphiken, obwohl das bei Delphi eher unüblich ist.


ferra - Di 25.01.11 18:07

Guten Abend,

danke für die bisherigen Antworten.

Das ganze mit dem Versuch, eine Farbe transparent zu setzen, hat nicht ganz geklappt. Nun versuche ich es mit PNG zu realisieren.
Das ganze klappt auch, leider ist es mir zu rechenintensiv. Das ganze Programm ist seitdem starkt langsamer geworden.

Hat jemand einen Rat für mich, wie ich es etwas "hochdrehen" könnte?

MfG ferra