问题
I've got the following image:
I'm reading it from resources, putting into ImageList and then reading it from ImageList to draw on my control's surface. But when I'm doing that, image seems to loose information about alpha channel:
Here are all relevant pieces of code:
Program.cs
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
MainForm.cs
ilFilters = new ImageList()
{
ColorDepth = ColorDepth.Depth32Bit,
ImageSize = new Size(16, 16)
};
// (...)
if (info.Icon != null)
{
if (info.Icon.Width == 16 && info.Icon.Height == 16)
{
ilFilters.Images.Add(info.Icon);
index = ilFilters.Images.Count - 1;
}
}
I actually saved the image before (info.Icon
) and after (ilFilters.Images[0]
) putting it into the image list. The first version was correct, second - corrupted. Seems like ImageList damaged the image.
I also tried converting the PNG to 32-bit BMP image. No success.
The system I'm running is Windows 7. .NET 4.5.1, Visual Studio 2013 Community.
How can I keep alpha channel of the image when adding to imagelist?
Edit: Proof of concept application.
回答1:
From the proof of concept you posted, I figured out a simple way to make it work. Basically, you have to define the ImageList
in the WinForms designer.
In order to provide a complete answer, here are all the steps I've taken to make it work:
- In the designer view of the
Form
, create anImageList
from the ToolBox. - In designer, set ColorDepth to "Depth32Bit", the correct image size and TransparentColor to "Transparent".
- After
InitializeComponent()
, add your images
Like this:
ImageList1.Images.AddRange(new[]
{
Resources.IconPlay,
Resources.IconPause,
Resources.IconStop,
[...]
});
- Assign the ImageList to the TreeView in the designer.
- Then, use the ImageIndex property of the TreeViewItem
This is how I do it and it works great.
Also, in your example, you use
g.Draw(imageList.Images[0], ...)
instead of
imageList.Draw(g, ...)
来源:https://stackoverflow.com/questions/28902091/32-bit-images-on-imagelist