设置WPF ImageSource的透明度(相当于GDI Matrix33 = 0.5f)?

4
WPF有相应的等效物吗?
ImageAttributes ia = new ImageAttributes();
ia.SetColorMatrix(new ColorMatrix { Matrix33 = 0.5f }, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);

换句话说,我能否调整WPF ImageSource(或任何其他绘图相关类,例如BitmapImage)的透明度,或者GDI在这里是最好的选择?
我不打算将图像绘制到窗口上,因此我认为不能使用Image类(?)
(我尝试使用WPF而不是GDI的想法主要是因为我认为使用WPF可以进行硬件加速,但从目前看来,它似乎仅适用于非常有限的一部分图像处理)
3个回答

2
请查看 WriteableBitmapEx,它提供了一组扩展方法,可在 WPF 和 Silverlight 中操作内存中的位图。WPF/Silverlight 类 WriteableBitmap 没有直接提供此功能,但提供了一个快速、低级别的 API 以进行绘制/操作,并且是 WPF 的本机功能。WriteableBitmapEx 则通过提供扩展方法来执行类似 GDI 的操作。其中有一个名为 Convolute 的函数,允许使用矩阵对图像进行卷积,因此您可以完成上述操作。请注意,WB-Ex 是一个 Silverlight 库,但他们还提供了一个未维护的 WPF 版本,虽然不完整,但可以扩展以与 Silverlight 版本保持同步。除此之外,建议您自己编写代码。如果您只想将不透明度修改为 0.5f,则建议根据上述示例编写特定函数,而不是进行卷积。

我无法从那些复杂的方法中弄清楚如何将一个方法移植到WPF,所以我尝试使用这里ForEach方法,但发现它比使用GDI要慢得多 - 而且那个方法也使用了不安全的代码!我正在尝试看看是否可以使用WPF进行此类操作,因为它具有硬件加速功能,但现在似乎只适用于像Visuals这样的东西...如果没有更好的选择,我想我只能使用GDI了。 - unrelativity
我不知道,我用WriteableBitmapEx做了一些非常快的操作。你具体是在尝试什么?请注意,很多扩展都有一个Bitmap.Lock()在前后,这是一个缓慢的操作。以该库中的代码为起点,您是否考虑过按4个像素(从不安全指针)的步长迭代像素并修改结果?原因是格式为BGRA的图像每四个字节中有一个字节等于alpha通道字节。这可能非常快速。 - Dr. Andrew Burnett-Thompson

1

图像具有一个 opacity 字段,它是一个介于 1.0(完全不透明)到 0.0(不可见)之间的值。

例如:

<Image 
 Height="107" 
 Margin="367,0,473,83" 
 Source="Images/4.png" 
 Stretch="Fill" 
   VerticalAlignment="Bottom" Opacity="0.5"/>

但是难道将该图像返回为可以保存的形式的唯一方法不是通过类似于RenderTargetBitmap的东西吗?这不会导致不透明度的丢失吗? - unrelativity

0

根据您的评论,我创建了一个示例项目,可以使用WriteableBitmapEx作为基础快速修改Alpha通道,并上传到我的公司博客。请原谅格式,这是一个新网站,仍然有一些故障需要解决!下载链接在标题为BitmapAlphaChannel的页面上。

您说得对,WPF的硬件加速仅适用于有限的功能子集。例如,所有布局都在CPU上完成,曲面细分也在CPU上完成,只有最终渲染是在GPU上完成的。结果是,在我的经验中,WPF比GDI+慢,当然比GDI慢。但是,它可以朝着正确的方向推进,以达到您想要的速度!


抱歉,该网站已不存在。我建议查看http://writeablebitmapex.codeplex.com/的示例。 - Dr. Andrew Burnett-Thompson

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