当剪辑矩形可能应用于此图形时,我需要绘制32位PNG图像,并将半透明像素加载到Graphics的ImageList控件中。原来,我无法使用Graphics.DrawImage()方法执行此操作。当我尝试调用Graphics.DrawImage
的某些重载版本时,半透明像素只是变成了灰色。
作为示例,请看以下图片:
上面的图片是使用以下形式的以下重新定义的OnPaint方法创建的:
protected override void OnPaint(PaintEventArgs e) { imageList1.Draw(e.Graphics, 10, 30, 0); e.Graphics.DrawImage(imageList1.Images[0], 10, 90); base.OnPaint(e); }
您可以看到,基于Win32 API ImageList.Draw()函数的第一个ImageList_DrawEx方法可以正确呈现半透明像素,而GDI + Graphics方法则不能。我很乐意使用
ImageList.Draw
,因为它可以正常工作,但是GDI +剪辑矩形不能使用它(因为它的GDI性质)。
[如果可以受GDI +剪辑矩形限制,是否有一种方法可以使用纯GDI +方法正确绘制具有半透明像素的32位PNG图像?
如果可能有帮助,我可以通过以下方式在设计时将图像上传到ImageList控件中:
ImageList
控件拖放到设计者的表面上。ColorDepth
属性设置为Depth32Bit
。ImageSize
属性(该测试图标为48, 48
。Images
属性的编辑器中单击了省略号按钮,并在其图像收藏编辑器中通过其添加按钮添加了该图标。可以从this page下载测试的手机图标。>>
当剪辑矩形可能应用于此图形时,我需要绘制32位PNG图像,并将半透明像素加载到Graphics的ImageList控件中。原来我做不到...
不是您问题的直接答案,但是您可以通过在运行时加载图像来解决此问题,如下所示。
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Image img = Image.FromFile("file.png");
ImageList tempImageList = new ImageList();
tempImageList.ImageSize = img.Size;
tempImageList.Images.Add(img);
e.Graphics.DrawImage(tempImageList.Images[0], new Rectangle(10, 50, 48, 48));
e.Graphics.DrawImage(tempImageList.Images[0], new Rectangle(10, 100, 256, 256));
}