AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Wie erstellt man ein transparentes pf32bit-Bitmap?
Thema durchsuchen
Ansicht
Themen-Optionen

Wie erstellt man ein transparentes pf32bit-Bitmap?

Ein Thema von Keldorn · begonnen am 9. Nov 2013 · letzter Beitrag vom 10. Nov 2013
 
Thom

Registriert seit: 19. Mai 2006
570 Beiträge
 
Delphi XE3 Professional
 
#4

AW: Wie erstellt man ein transparentes pf32bit-Bitmap?

  Alt 9. Nov 2013, 15:32
Wobei eine Bitmap dafür eigentlich wenig sinnvoll ist. [...]
[...] Dann sind solche problematischen Workarounds gar nicht mehr nötig.
Ich glaube mit Bordmitteln geht das nicht wirklich, weil das alles noch auf GDI32 aufbaut. [...]
Ist schon interessant, wie hartnäckig sich Vorurteile halten...

Natürlich geht das auch mit TBitmap.
Wichtig ist, daß bei der Erstellung des Bitmaps auch die Eigenschaft AlphaFormat gesetzt wird, damit TBitmap intern die Methode AlphaBlend verwendet. Die zweite Sache ist, daß ein neues Bitmap weiß gefüllt ist und einen Alphawert von $FF für jedes Pixel besitzt. Deshalb muß es vor dem Kopieren eines Icons vollständig gelöscht werden, da sonst das Icon auf den weißen Hintergrund gerendert wird.

Da Du XE2 verwendest, habe ich das mal schnell als Class-Helper programmiert:
Delphi-Quellcode:
type
  TBitmapHelper = class helper for TBitmap
    procedure Clear(Color: TColor; Alpha: Byte);
  end;

procedure TBitmapHelper.Clear(Color: TColor; Alpha: Byte);
type
  TColor32 = packed record
    case Integer of
      0: (B, G, R, A: Byte);
      1: (BGRA: UInt32);
    end;
  TColor32Array = array[0..0] of TColor32;
  PColor32Array = ^TColor32Array;
var
  X, Y: Integer;
  R, G, B: Byte;
  Line: PColor32Array;
begin
  R:=GetRValue(Color);
  G:=GetGValue(Color);
  B:=GetBValue(Color);
  for Y:=0 to Height-1 do
  begin
    Line:=ScanLine[Y];
    for X:=0 to Width-1 do
    begin
      Line[X].R:=R;
      Line[X].G:=G;
      Line[X].B:=B;
      Line[X].A:=Alpha;
    end;
  end;
end;
Damit funktioniert sowohl das Kopieren eines 32Bit Bildes aus einer Image-Liste in das leere Bitmap als auch dessen Ausgabe in eine Paintbox:
Delphi-Quellcode:
procedure TForm1.PaintBox1Paint(Sender: TObject);
var
  Bmp: TBitmap;
begin
  Bmp:=TBitmap.Create;
  try
    Bmp.SetSize(50,50);
    Bmp.PixelFormat:=pf32bit;
    Bmp.AlphaFormat:=afDefined;
    Bmp.Clear(clBlack,0);
    ImageList1.Draw(Bmp.Canvas,0,0,0);
    //PaintBox1.Canvas.Draw(0,0,Bmp);
    PaintBox1.Canvas.StretchDraw(Rect(0,0,100,100),Bmp);
  finally
    Bmp.Free;
  end;
end;
Thomas Nitzschke
Google Maps mit Delphi

Geändert von Thom ( 9. Nov 2013 um 15:39 Uhr) Grund: Beispiel mit StretchDraw ergänzt
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:06 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