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
Antwort Antwort
Seite 1 von 2  1 2      
Keldorn

Registriert seit: 6. Mär 2003
Ort: Meißen
876 Beiträge
 
Delphi 10.1 Berlin Professional
 
#1

Wie erstellt man ein transparentes pf32bit-Bitmap?

  Alt 9. Nov 2013, 12:43
Hallo,

noch ein Problem, an dem ich mir die Zähne ausbeiße. Wie bekommt ein 32bit-Bitmap wirklich transparent? Ich meine nicht transparent/transparentcolor, das reicht nicht.
(Hintergrund: ich möchte ein 32bit-Alpha-Icon per DrawIconEx skaliert auf ein Bitmap zeichnen und dieses Bitmap mit Transparenz weiterverwenden)

Wenn ich ein Bitmap erstelle
Delphi-Quellcode:
Bmp:=TBitmap.create;
Bmp.Pixelformat:=pf32bit;
BMP.Width:=50;
BMP.height:=50;

DrawIconEx(…);
Canvas.draw(0,0,bmp);
Ist der Hintergrund trotzdem weiß.

Wenn ich das dazwischen setze,
Delphi-Quellcode:
  png:=TPngImage.CreateBlank(COLOR_RGBALPHA,8,bmp.Width,bmp.Height);
  bmp.Assign(png);
Hab ich was ich will. Aber wie bekomme ich das ohne den Umweg über ein PNG hin?

Danke&Gruß Frank

Lükes Grundlage der Programmierung:
Es wird nicht funktionieren
(Murphy)
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
673 Beiträge
 
#2

AW: Wie erstellt man ein transparentes pf32bit-Bitmap?

  Alt 9. Nov 2013, 13:58
TBitmap32
Achtung: Bin kein Informatiker sondern komme vom Bau.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Wie erstellt man ein transparentes pf32bit-Bitmap?

  Alt 9. Nov 2013, 14:11
Wobei eine Bitmap dafür eigentlich wenig sinnvoll ist. Muss es denn unbedingt eine Bitmap sein?
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Keldorn

Registriert seit: 6. Mär 2003
Ort: Meißen
876 Beiträge
 
Delphi 10.1 Berlin Professional
 
#4

AW: Wie erstellt man ein transparentes pf32bit-Bitmap?

  Alt 9. Nov 2013, 14:19
Danke, aber ich wollte das erstmal mit boardmitteln lösen bzw. die ganze Sache auch verstehen .

Wobei eine Bitmap dafür eigentlich wenig sinnvoll ist. Muss es denn unbedingt eine Bitmap sein?
ja. dient auch der Weiterverarbeitung. Um noch etwas auszuholen: das Icon wird aus einer imagelist geholt. Da würde ich zwar auch schon die Bitmap rausbekommen, aber mit getmbitmap geht die Transparenz genauso flöten. mit Geticon nicht.

Lükes Grundlage der Programmierung:
Es wird nicht funktionieren
(Murphy)
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.202 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Wie erstellt man ein transparentes pf32bit-Bitmap?

  Alt 9. Nov 2013, 14:38
Wenn du nicht unbedingt auf Bordmittel festgelegt bist: In den Elpack-Komponenten (sicherlich auch bei anderen Sammlungen ähnlich) kann man alle Gui-Controls (imageList, ....) mit PNG's arbeiten lassen. Dann sind solche problematischen Workarounds gar nicht mehr nötig.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Wie erstellt man ein transparentes pf32bit-Bitmap?

  Alt 9. Nov 2013, 16:01
Danke, aber ich wollte das erstmal mit boardmitteln lösen bzw. die ganze Sache auch verstehen .
Ich glaube mit Bordmitteln geht das nicht wirklich, weil das alles noch auf GDI32 aufbaut. Wobei es mich dann allerdings wundert, dass das mit bmp.Assign(png); laut deiner Aussage funktioniert. Hast du auch ausprobiert, dass das mit allen Hintergrundfarben funktioniert? Nicht, dass es nur gerade zufällig so aussieht als würde es funktionieren, weil beim Entfernen des Alphakanals zufällig gegen die richtige Farbe geblendet wird... Wenn ich halbtransparente Bilder in MS Paint einfüge, werden die z.B. auch gegen einen virtuellen, schwarzen Hintergrund geblendet.

Also ich würde dir auch zu Graphics32 raten, die Lib ist wirklich gut.
  Mit Zitat antworten Zitat
Thom

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

AW: Wie erstellt man ein transparentes pf32bit-Bitmap?

  Alt 9. Nov 2013, 16: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 16:39 Uhr) Grund: Beispiel mit StretchDraw ergänzt
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.202 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Wie erstellt man ein transparentes pf32bit-Bitmap?

  Alt 9. Nov 2013, 16:40
[...] Dann sind solche problematischen Workarounds gar nicht mehr nötig.
Ist schon interessant, wie hartnäckig sich Vorurteile halten...

...

Da Du XE2 verwendest, habe ich das mal schnell als Class-Helper programmiert:
Das was du in einen Helper programmiert hast ist für mich ein Workaround. zwar nicht mehr ganz so unelegant wie früher ohne Helper, aber letztendlich ist es einer.

Also wo ist das Vorurteil?
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Thom

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

AW: Wie erstellt man ein transparentes pf32bit-Bitmap?

  Alt 9. Nov 2013, 16:58
Wozu sollte ein komplettes und umfangreiches Framework wie TBitmap32 oder Elpack verwendet werden, wenn das Problem auch mit einer einzigen (!!!) zusätzlichen Methode und integrierten Objekten zu lösen ist? Und weshalb stellt das Löschen eines 32Bit Bitmaps bzw. das Kopieren eines Bildes (Icon/Bitmap) aus einer Image-Liste in ein Bitmap einen "problematischen" Workaround dar?

Mit den Vorurteilen meinte ich die bezüglich der Untauglichkeit von TBitmap in Zusammenhang mit teiltransparenten Bildern. Es funktioniert (zumindest in neueren Delphi-Versionen) - man muß nur wissen, wie.
Thomas Nitzschke
Google Maps mit Delphi

Geändert von Thom ( 9. Nov 2013 um 17:50 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Wie erstellt man ein transparentes pf32bit-Bitmap?

  Alt 9. Nov 2013, 17:59
Es funktioniert (zumindest in neueren Delphi-Versionen) - man muß nur wissen, wie.
Es funktioniert, ja, das heißt aber nicht, dass es sinnvoll ist.
Aber wenn es nicht anders geht, bleibt einem ja nichts anderes übrig.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 21:13 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