在GDI+中使用自定义透明度绘制图像

4
我正在使用Drawing.Graphics对象和DrawImage()函数将许多图像(所有图像的dimensions=24x24 pixelformat=32BppPArgb)绘制到一个控件上。我的应用程序可以缩小,这意味着Graphics对象附加了一个Transform Matrix来控制缩放和平移。
当缩放低于50%时,绘制这些图标没有意义,但我希望从绘制图标到不绘制图标的过渡更加平滑。也就是说,从70%开始,图标应该以额外的透明度因子绘制,以便在50%时完全变为透明。
如何在不显著增加绘制时间的情况下绘制具有额外透明度的位图?
谢谢, David

我知道这是一个GDI+的问题,但你有没有考虑升级到WPF呢?它可以使这样的事情变得非常简单,并且还有许多其他好处。听起来你的应用程序足够复杂,可以从WPF的高级功能中受益。 - Ray Burns
@Ray,这将涉及到重写超过50%的应用程序,而我已经花了3年时间来开发它。我希望能够使用透明位图,但不愿以这样的代价来实现。 - David Rutten
1个回答

7
您只需创建一个合适的ColorMatrix,用它初始化一个ImageAttributes对象,并将该ImageAttributes对象传递给Graphics.DrawImage的其中一个重载版本即可。以下示例将使图像具有50%的透明度:
  float[][] matrixAlpha =
  {
   new float[] {1, 0, 0, 0, 0},
   new float[] {0, 1, 0, 0, 0},
   new float[] {0, 0, 1, 0, 0},
   new float[] {0, 0, 0, 0.5f, 0}, 
   new float[] {0, 0, 0, 0, 1}
  }; 
  ColorMatrix colorMatrix = new ColorMatrix( matrixAlpha );

  ImageAttributes iaAlphaBlend = new ImageAttributes();
  iaAlphaBlend.SetColorMatrix(
   colorMatrix,
   ColorMatrixFlag.Default,
   ColorAdjustType.Bitmap );

谢谢Danbystrom,看起来正是我所需要的。 - David Rutten

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接