GDI+中的半透明像素支持;Graphics.DrawImage()方法

GDI+中的半透明像素支持;Graphics.DrawImage()方法,image,winapi,gdi+,imagelist,Image,Winapi,Gdi+,Imagelist,我需要绘制32位PNG图像,其中半透明像素加载到图形上的ImageList控件中,此时剪辑矩形可能应用于此图形。事实证明,我不能用这种方法来做这件事。当我试图调用一些重载版本的Graphics.DrawImage时,半透明像素变成了灰色 例如,请看下图: 上面的图片是使用表单的以下重新定义的OnPaint方法创建的: protected override void OnPaint(PaintEventArgs e) { imageList1.绘图(如图形,10,30,0); e、 Graphi

我需要绘制32位PNG图像,其中半透明像素加载到图形上的ImageList控件中,此时剪辑矩形可能应用于此图形。事实证明,我不能用这种方法来做这件事。当我试图调用一些重载版本的
Graphics.DrawImage
时,半透明像素变成了灰色

例如,请看下图:

上面的图片是使用表单的以下重新定义的OnPaint方法创建的:

protected override void OnPaint(PaintEventArgs e)
{
imageList1.绘图(如图形,10,30,0);
e、 Graphics.DrawImage(imageList1.Images[0],10,90);
基础漆(e);
}
如您所见,第一种基于Win32 API函数的方法正确渲染半透明像素,而GDI+Graphics方法则不正确。我很乐意使用
ImageList.Draw
,因为它可以正确地工作,但是GDI+剪辑矩形不能使用它(因为它的GDI特性)

如果纯GDI+方法受到GDI+剪辑矩形的限制,有没有办法用半透明像素正确绘制32位PNG图像


如果有帮助,我在设计时通过以下方式将图像上载到ImageList控件:

  • ImageList
    控件拖放到设计器的表面上
  • ColorDepth
    属性设置为
    Depth32Bit
  • 设置
    ImageSize
    属性(
    48,48
    用于该测试图标)
  • 单击
    图像
    属性编辑器中的省略号按钮,并在图像集合编辑器中添加图标及其添加按钮

  • 我使用的48x48大小的测试手机图标可以从下载。

    您可能需要检查图形属性CompositingMode

    它应该设置为
    e.Graphics.CompositingMode=CompositingMode.SourceOver


    否则,图形对象不使用透明度。如果使用ImageList控件的draw方法,我假设这是由ImageList控件隐式完成的。

    显示如何加载图像。在GDI+版本中,有一个透明的colorkey可能会被忽略。您还可以添加PNG图像样本。@BarmakShemirani,我刚刚在我的问题中添加了您要求的内容。这很奇怪。如果您使用
    tempImageListImages.Add(Image.FromFile(“file.png”))
    否则会得到那些灰色边缘。@BarmakShemirani,
    ImageList
    类不提供
    Add()
    方法。至少,在经典的WinForms和.NET中。你是说
    ImageList.Items.Add()
    ?在任何情况下,如果我执行
    ImageList.Items.Add(Image.FromFile(…))
    ,我都会有相同的灰色边缘。GDI+可以为您执行预乘法,进行一些研究。我选中了
    合成模式
    。默认情况下,它设置为
    SourceOver
    ,这没有帮助。