ImageList上的32位图像

时间:2015-03-06 15:30:53

标签: c# image winforms alpha-transparency imagelist

我有以下图片:

Icon

我正在从资源中读取它,放入ImageList,然后从ImageList读取它以在我的控件表面上绘制。但是当我这样做时,图像似乎松散了有关alpha通道的信息:

Screenshot

以下是所有相关的代码:

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;
    }
}

我实际上是在(info.Icon)之前和之后(ilFilters.Images[0])将图像保存到图像列表中。第一个版本是正确的,第二个 - 已损坏。好像ImageList损坏了图像。

我也尝试将PNG转换为32位BMP图像。没有成功。

我正在运行的系统是Windows 7. .NET 4.5.1,Visual Studio 2013社区。

添加到图像列表时,如何保留图像的Alpha通道?


修改: Proof of concept application

1 个答案:

答案 0 :(得分:4)

从您发布的概念证明中,我找到了一种简单的方法来使其发挥作用。基本上,您必须在WinForms设计器中定义ImageList

为了提供完整的答案,以下是我为使其发挥作用而采取的所有步骤:

  1. Form的设计器视图中,从工具箱中创建ImageList
  2. 在设计器中,将 ColorDepth 设置为“Depth32Bit”,将正确的图像尺寸设置为 TransparentColor 设置为“透明”。
  3. InitializeComponent()后,添加图片
  4. 像这样:

    ImageList1.Images.AddRange(new[]
    {
        Resources.IconPlay,
        Resources.IconPause,
        Resources.IconStop,
        [...]
    });
    
    1. 将ImageList分配给设计器中的TreeView。
    2. 然后,使用TreeViewItem的ImageIndex属性
    3. 我就是这样做的,效果很好。

      另外,在您的示例中,您使用

      g.Draw(imageList.Images[0], ...)
      

      而不是

      imageList.Draw(g, ...)