14
votes

I want to load a PNG with transparent background in a TImageList and use it in a TMainMenu (via TAction).
However, in Delphi the background is just black. Is PNG support only half implemented in Delphi?

This guy says it worked for him but with a button instead of a main menu.

My setup:

  • My image is 8 bit per color plus 8 bit for transparency channel (I have tried also with 1 bit for transparency but still doesn't work). The image looks just fine in any other program.
  • Delphi XE.
  • In TImageList's editor the 'transparent color' and 'Fill color' are set to 'Default' and are disabled.
3
Hi RRuz. I use a TImageList. It has a DrawingStyle properties and it can only be set to 'transparent' (which is still not working). But there is not cd32bit.Z80
Sorry I mean the property ColorDepth must be setted to cd32BitRRUZ
You have to reload the images when you change the colordepth. It is the same as changing width or height. I have no problem with this setting on Windows 7, even when DrawingStyle is set to normal.Uwe Raabe
@Altar when you change some properties of the TimageList component like (ex: Width, Height or ColorDepth) the images are removed from the component this is how the TImagelist works. Ayway returning to your original issue you must the set ColorDepth property of the TimageList to cd32Bit and then load the images which must be in 32 bpp png format.RRUZ
"a lot of work would have been lost"... Surely you are using a source version control system?Marjan Venema

3 Answers

13
votes

There's no reason to backup whole DFM file.

Before doing something to your ImageList you should export your images: click the "Export" button in the image list editor and it will save all images to a single .BMP file.

After changing properties: ColorDepth = cd32Bit, DrawingStyle = dsTransparent

You should click "Add" button and select the file you previously exported. Then, images will be drawn with transparency in the menu and toolbars (on D2010 at least)... No need to use 3rd party components.

7
votes
  1. Set the following property values for TImageList:
  • DrawingStyle: dsTransparent
  • ColorDepth: cd32Bit
  1. In "Project Settings" under "Application" set "Enable runtime themes".

Update for Delphi Rio:

TImageList must have:

  • BkGColor = clNone
  • BlendColor = clNone,
  • ColorDepth = cd32bit,
  • DrawingStyle = dsTransparent (or) dsNormal,
  • Masked = true.

The images can be loaded from a PNG with transparent bkg color.


Note: Editing some properties of TImageList will delete (without any notice) all existing images in your list. Backup your images first.

6
votes

I had been using TPngComponents since Delphi 7. That provide very good png support for most of the delphi build-in / third party components. Embarcadero had purchased another well know Open Sources PNG Supporting component know as TPngImage and build into Delphi's native graphic support in later Delphi versions. So when I changed to Delphi 2010, I think Delphi had native support now and test out the native support but find that the alpha support is not good enough.

So I had used back that TPngComponents again and it had better support for most components, including main menu. I think that package should be usable to DXE with limited modification.

edit : Thanks for Uwe Raabe for pointing out the product Codegear (now Embarcadero) purchased was another component TPngImage rather then the TPngComponent.