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

问题描述 投票:1回答:1

当剪辑矩形可能应用于此图形时,我需要绘制32位PNG图像,并将半透明像素加载到Graphics的ImageList控件中。原来,我无法使用Graphics.DrawImage()方法执行此操作。当我尝试调用Graphics.DrawImage的某些重载版本时,半透明像素只是变成了灰色。

作为示例,请看以下图片:

enter image description here

上面的图片是使用以下形式的以下重新定义的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控件中:

  1. ImageList控件拖放到设计者的表面上。
  2. ColorDepth属性设置为Depth32Bit
  3. 设置ImageSize属性(该测试图标为48, 48
  4. Images属性的编辑器中单击了省略号按钮,并在其图像收藏编辑器中通过其添加按钮添加了该图标。
  5. enter image description here

可以从this page下载测试的手机图标。>>

当剪辑矩形可能应用于此图形时,我需要绘制32位PNG图像,并将半透明像素加载到Graphics的ImageList控件中。原来我做不到...

image winapi gdi+ imagelist
1个回答
0
投票

不是您问题的直接答案,但是您可以通过在运行时加载图像来解决此问题,如下所示。

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));
}
© www.soinside.com 2019 - 2024. All rights reserved.