GDI+中的半透明像素支持;Graphics.DrawImage()方法
我需要绘制32位PNG图像,其中半透明像素加载到图形上的ImageList控件中,此时剪辑矩形可能应用于此图形。事实证明,我不能用这种方法来做这件事。当我试图调用一些重载版本的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
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
,这没有帮助。