Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi gr32 | Eine Farbe als Transparent markieren (https://www.delphipraxis.net/96366-gr32-%7C-eine-farbe-als-transparent-markieren.html)

halinchen 23. Jul 2007 09:56


gr32 | Eine Farbe als Transparent markieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi!

Ich habe ein Bitmap was als *.bmp Datei vorliegt.
Ich möchte das Bitmap auf ein TBitmap32-Objekt kopieren und die Farbe clFuchsia soll Transparent sein. (Also der Hintergrund, denn ich eher zeichne soll durchgucken).

Von hier habe ich mir die Procedure abgeändert:

Ich habe turboPASCALs Demo so abgeändert, das es statt einem PNG-Image eine Bitmap einlist und die 1. Farbe als Transparenzfarbe nimmt. Wenn die 1. Farbe schwarz war gings. Wenn die was anderes war gings nicht. (Wenn es schwarz war hat es den Pixel auf $0 gesetzt. Wenn ich ihn bei mir auf $0 setze, zeichnet es auf meinen Hintergrund das Bild und die Transparentsfarbe ersetzt es durch schwarz.)

Delphi-Quellcode:
procedure TfrmMain.SetTransparent(DstBitmap: TBitmap32;TransparentColor: TColor32);
var
  PixelPtr: PColor32;
  X, Y: Integer;
begin
  DstBitmap.ResetAlpha;

  TransparentColor := TransparentColor;
  PixelPtr := PColor32(@DstBitmap.Bits[0]);
  for X := 0 to (DstBitmap.Height - 1) * (DstBitmap.Width - 1) do
  begin
    if PixelPtr^ = TransparentColor then
      PixelPtr^ := PixelPtr^ and $00FFFFFF;
    Inc(PixelPtr);
  end;

end;

procedure TfrmMain.MenuDraw;
var
  temp32: TBitmap32;
  temp : TBitmap;

  PixelPtr : PColor32;
  x,y:integer;
begin
 temp := TBitmap.Create;
 try
  temp32 := TBitmap32.Create;
  try
    temp32.Assign(bmpBackground);
    bmpMenu.Draw(0,0,temp32); //bmpMenu = TBitmap32
    imgBtn.GetBitmap(0,temp); //ImageList
    temp32.Assign(temp);
    SetTransparent(temp32,Color32(clFuchsia));
    bmpMenu.Draw(100,100,temp32);
  finally
    temp32.Free;
  end;
 finally
  temp.Free;
 end;
end;
edit: Bitte Beachtet, bei turboPASCALs Demo ging es mit schwarz und bei mir geht es gar nicht!

SirThornberry 23. Jul 2007 09:59

Re: gr32 | Eine Farbe als Transparent markieren
 
also die Zeile kannst du schonmal weg lassen:
Delphi-Quellcode:
TransparentColor := TransparentColor;
Oder besser: wähle andere Variablennamen bzw. setze "Self." vor den entsprechenden teil.
Das ist übrigens genau die Stelle woran es bei dir scheitert.
Self.TransparentColor
ist per Default clBlack. Daher funktioniert es wenn es schwarz ist (weil da nichts geändert werden muss). Sobald aber eine andere Farbe verwendet wird geht es nicht weil du das Self.TransparentColor nie neu setzt.
Letztendlich sagst du mit der obigen Anweisung also "Farbparameter = Farbparameter" aber du willst eigentlich sagen "Form.Eigenschaft = Farbparameter"

Wie bereits gesagt. Ordentliche Variablenbenennung wählen so das man auch weiß ob die Variable eine lokale, ein Argument, ein Member etc. ist und im Idealfall zur Übersichtlichkeit "Self." vorranstellen wenn es um ein Member geht.

halinchen 23. Jul 2007 10:10

Re: gr32 | Eine Farbe als Transparent markieren
 
Hm. Ich habs weggemacht und es geht immer noch nicht.

Die Zeile
Delphi-Quellcode:
PixelPtr^ := PixelPtr^ and $00FFFFFF;
führt es aus. Aber $FFFF00FF and $00FFFFFF ist $00FF00FF. Aber es jetzt ist der schwarze Rahmen clFuchsia.

Ist der Wert $00FFFFFF ein konstanter Wert oder ist der für jede Farbe verschieden?

edit: Du hast was falsch verstanden. Ich will nicht die Form an der Stelle durchsichtig machen. Ich will, das es beim zeichnen die Farben die clFuchsia sind nicht zeichnet!

SirThornberry 23. Jul 2007 10:12

Re: gr32 | Eine Farbe als Transparent markieren
 
du verstehst den Quelltext nicht oder?!
Mit wegmachen meinte ich das die Anweisung so keinen Sinn macht also nonesence ist.
Wenn du daraus das machst:
Delphi-Quellcode:
Self.TransparentColor := TransparentColor;
funktioniert es.

halinchen 23. Jul 2007 10:15

Re: gr32 | Eine Farbe als Transparent markieren
 
siehe meinem edit. Sry war vielleicht etwas schelcht formuliert.

Meine Anwendung von turboPASCALs Funktion hat nichts mit ihrer eigentlichen zutun. Ich will den Bereich im Bitmap und nicht in der Form Transparent machen.

edit: Ich hab das so kapiert: TBitmap32 untestützt AlphaTransparenz. Also kann ich meinetwegen den Pixel [5,5] auf 50% durchsichtigkeit setzen. Beim Zeichen mischen sich dann 50% der Farbe darunter mit der neuen Farbe.

Ich will aber die Transparenz an allen Pixel wo die Farbe clFuchsia ist auf 100% setzen. Beim Zeichnen sollen sich dann 100% der Farbe darunter und 0% der Farbe clFuchsia mischen. Somit hätte der Button keinen Rand und man sieht dort den hellblauen Hintergrund.

Sry. Ich arbeite das 1. Mal mit gr32 und bei normalen Bitmaps musste ich einfach nur Transparent auf true setzen.

edit2:in der Hilfe zu gr32 steht:

Zitat:

Alpha := Color32 shr 24;
Aber bei allen Pixeln ist dann Alpha = 0. d.h es schon transparent. Aber warum wird es beim zeichnen nicht berücksicht?

edit3: Ich hab's. Man muss DrawMode auf dmTransparent setzen.

Hier nochmal die gesamte Code:

Delphi-Quellcode:
procedure TfrmMain.MenuDraw;
var
  temp32: TBitmap32;
  temp : TBitmap;

  PixelPtr : PColor32;
  x,y:integer;
begin
 temp := TBitmap.Create;
 try
  temp32 := TBitmap32.Create;
  try
    temp32.Assign(bmpBackground);
    bmpMenu.Draw(0,0,temp32);
    imgBtn.GetBitmap(0,temp);
    temp32.Assign(temp);
    SetTransparent(temp32,Color32(clFuchsia));
    temp32.DrawMode := dmTransparent;
    bmpMenu.Draw(Rect(171,36,171+300,36+50),Rect(1,1,temp32.Width-1,temp32.Height-1),temp32);
    //bmpMenu.Draw( 171,36,temp32);
  finally
    temp32.Free;
  end;
 finally
  temp.Free;
 end;
end;

procedure TfrmMain.SetTransparent(DstBitmap: TBitmap32;TransparentColor: TColor32);
var
  PixelPtr: PColor32;
  X, Y: Integer;
begin
  DstBitmap.ResetAlpha;

  PixelPtr := PColor32(@DstBitmap.Bits[0]);
  for X := 0 to (DstBitmap.Height) * (DstBitmap.Width) do
  begin
    if PixelPtr^ = TransparentColor then begin
      //PixelPtr^ := PixelPtr^ and $00FFFFFF;
      PixelPtr^ := 0;

    end;
    Inc(PixelPtr);
  end;

end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:46 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz