Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Bitmap transparent aus TImageList holen (https://www.delphipraxis.net/199882-bitmap-transparent-aus-timagelist-holen.html)

amigage 27. Feb 2019 15:53

Bitmap transparent aus TImageList holen
 
Hallo,

ich bin am Verzweifeln und habe schon einige Stunden im Netz recherchiert, aber keine wirkliche Lösung gefunden, die mein simples Problem löst.

Ich habe eine TImageList, die mit transparenten Bitmaps gefüllt ist. Nun möchte ich ein TImage mit einem Bitmap aus der Imagelist transparent füllen.

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
  IconData : TBitmap;
  TransColor : TColor;
begin
  IconData := TBitmap.Create;

  ImageList1.GetBitmap(1, IconData); // das zweite Image soll angezeigt werden

//  IconData.PixelFormat := pf32Bit;
//  IconData.HandleType := bmDIB;
//  IconData.alphaformat := afDefined;

  IconData.Transparent := true;
  IconData.TransparentColor := clFuchsia;
//  IconData.TransparentMode := tmAuto;

  Image1.Picture.Bitmap := IconData;
end;
Imagelist-Eigentschaften:
BKColor: clFuchsia;
ColorDepth : cd32Bit;
Masked: true;

Und das TImage ist auf Transparent : true gesetzt.

Nichts passiert, egal welche Eigenschaft ich oben aktiviere, die Grafik wird immer mit dem Hintergrund dargestellt, der als BKColor angegeben ist. Außer bei ClNone, da wird der Hintergrund weiß.

Kann mir vielleicht jemand einen Tipp geben?
Besten Dank.

TiGü 27. Feb 2019 15:59

AW: Bitmap transparent aus TImageList holen
 
Auf was ist denn
Delphi-Quellcode:
ImageList1.DrawingStyle
gesetzt?

amigage 27. Feb 2019 16:07

AW: Bitmap transparent aus TImageList holen
 
Delphi-Quellcode:
ImageList1.DrawingStyle
ist auf dsTransparent gesetzt.

Neutral General 27. Feb 2019 16:13

AW: Bitmap transparent aus TImageList holen
 
Probier mal GetImage statt GetBitmap

amigage 27. Feb 2019 17:19

AW: Bitmap transparent aus TImageList holen
 
Wo meinst Du?
TImageList hat keine solche Methode.

peterbelow 28. Feb 2019 11:29

AW: Bitmap transparent aus TImageList holen
 
Zitat:

Zitat von amigage (Beitrag 1426544)
Hallo,

ich bin am Verzweifeln und habe schon einige Stunden im Netz recherchiert, aber keine wirkliche Lösung gefunden, die mein simples Problem löst.

Ich habe eine TImageList, die mit transparenten Bitmaps gefüllt ist. Nun möchte ich ein TImage mit einem Bitmap aus der Imagelist transparent füllen.

Imagelist-Eigentschaften:
BKColor: clFuchsia;
ColorDepth : cd32Bit;
Masked: true;

Und das TImage ist auf Transparent : true gesetzt.

Nichts passiert, egal welche Eigenschaft ich oben aktiviere, die Grafik wird immer mit dem Hintergrund dargestellt, der als BKColor angegeben ist. Außer bei ClNone, da wird der Hintergrund weiß.

Kann mir vielleicht jemand einen Tipp geben?
Besten Dank.

Du gehst das falsch an. Versuch nicht, die Bitmap aus der Imagelist zu holen, erzeuge eine eigene der richtigen Größe, fülle sie mit dem gewünschten Hintergrund, und verwende dann die Draw-Methode der Imagelist um die gewünschte Bitmap aus der Liste auf den Canvas deiner Bitmap zu zeichnen.

EWeiss 28. Feb 2019 11:34

AW: Bitmap transparent aus TImageList holen
 
Zitat:

Versuch nicht, die Bitmap aus der Imagelist zu holen
Was spricht dagegen wenn man wie du angedeutet hast die Bitmaps in der ImageList aktualisiert zur Laufzeit.
Danach sollten alle transparent sein.

Hatten wir schon..

Delphi-Quellcode:
function ImageListToGPBitmap(SourceImageList: TImageList): TGPBitmap;
var
    bmp: TGPBitmap;
    g: TGPGraphics;
    dc: HDC;
    i: Integer;
    x: Integer;

    procedure GdipCheck(Status: Winapi.GDIPAPI.TStatus);
    begin
        if Status <> Ok then
            raise Exception.CreateFmt('%s', [GetStatus(Status)]);
    end;
begin
    //Note: Code is public domain. No attribution required.
    bmp := TGPBitmap.Create(SourceImageList.Width*SourceImageList.Count, SourceImageList.Height);
    GdipCheck(bmp.GetLastStatus);

    g := TGPGraphics.Create(bmp);
    GdipCheck(g.GetLastStatus);

    g.Clear($00000000);
    GdipCheck(g.GetLastStatus);

    dc := g.GetHDC;

    for i := 0 to dmGlobal.imgImages.Count-1 do
    begin
        x := i * dmGlobal.imgImages.Width;

        ImageList_DrawEx(dmGlobal.imgImages.Handle, i, dc,
                        x, 0, dmGlobal.imgImages.Width, dmGlobal.imgImages.Height,
                        CLR_NONE, CLR_DEFAULT,
                        ILD_TRANSPARENT);
    end;
    g.ReleaseHDC(dc);
    g.Free;

    Result := bmp;
end;
Erst dann sind die Bitmaps in der ImageList wirklich Transparent.
Link zur Diskussion

gruss

Sherlock 28. Feb 2019 12:22

AW: Bitmap transparent aus TImageList holen
 
Und wo soll die Bitmap reingeladen werden? Die Unterstützung für transparente Bitmaps, also solche die einen Alphakanal haben, nicht die Trickserei mit irgendwelchen "transparenten" Farben wie clFuchsia, ist IIRC auch in Rio nicht korrekt/vollständig eingebaut. Dafür aber eine wunderbare Unterstützung von PNGs. Ich befülle meine ImageListe mit PNGs und kann die mit einem Einzeiler in ein TImage füllen, transparent.
Delphi-Quellcode:
notesImg.Bitmap := GlobalDataModule.IconList.Bitmap(TSizeF.Create(cSmallImgSize, cSmallImgSize ), ImgIndex);
Sherlock

EWeiss 28. Feb 2019 12:26

AW: Bitmap transparent aus TImageList holen
 
Zitat:

ist IIRC auch in Rio nicht korrekt/vollständig eingebaut.
Traurig genug.
Zitat:

Und wo soll die Bitmap reingeladen werden?
Es wird in der ImageList neu gezeichnet nicht reingeladen. Siehe ImageList_DrawEx
Einmalig beim Start der Anwendung wenn man es denn richtig macht.

gruss

Sherlock 28. Feb 2019 12:37

AW: Bitmap transparent aus TImageList holen
 
Ahja, tut mir Leid, falscher Begriff. Wo soll die Bitmap schlußendlich angezeigt werden? Ein TImage kann auch PNG, und TSpeedButton ebenso. Ich will eigentlich nur sagen: es werden endlich "moderne" Bilddatentypen unterstützt. Warum nicht nutzen?

Sherlock


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:15 Uhr.
Seite 1 von 3  1 23      

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