你能告诉我如何在wpf c#应用程序和png格式的资源图像的情况下,以编程方式确保转换为灰度后的透明度吗?
我创建了一个最小工作项目来测试,你可以在这里找到它:Github GrayTransparencyTest
编辑2:Github存储库已经更新为用户“Just Answer the Question”和“Clemens”的前两个解决方案。即使转换为灰度看起来与xaml稍有不同,透明度也得到了保留。
问题看起来像这样(现在包括前两个解决方案):
- 我需要第4张图像在转换为灰度后保留原始图像的透明度。*
使用XAML一切工作:
<Image>
<Image.Source>
<FormatConvertedBitmap DestinationFormat="Gray16">
<FormatConvertedBitmap.Source>
<BitmapImage UriSource="pack://application:,,,/GrayTransparencyTest;component/Media/priority.png" />
</FormatConvertedBitmap.Source>
</FormatConvertedBitmap>
</Image.Source>
<Image.OpacityMask>
<ImageBrush>
<ImageBrush.ImageSource>
<BitmapImage UriSource="pack://application:,,,/GrayTransparencyTest;component/Media/priority.png" />
</ImageBrush.ImageSource>
</ImageBrush>
</Image.OpacityMask>
</Image>
对FormatConvertedBitmap
使用绑定Image和C#方法,没有机会:
string imageKey = "priority";
Uri imageURI = new Uri($"pack://application:,,,/GrayTransparencyTest;component/Media/{imageKey}.png", UriKind.Absolute);
BitmapImage bitmapImage = new BitmapImage(imageURI);
ImageBrush opacityMask = new ImageBrush()
{
ImageSource = bitmapImage
};
FormatConvertedBitmap bitmapGreyscale = new FormatConvertedBitmap();
bitmapGreyscale.BeginInit();
bitmapGreyscale.Source = new BitmapImage(imageURI);
bitmapGreyscale.DestinationFormat = PixelFormats.Gray16;
bitmapGreyscale.EndInit();
ImageGray = new Image()
{
Source = bitmapGreyscale,
OpacityMask = opacityMask,
};
看起来OpacityMask不起作用。请问如何为Image添加透明度?您能告诉我这个OpacityMask = opacityMask
是否真的不应该以我期望的方式工作,或者我如何修复它以像XAML一样工作?(解决方法:直接作为资源的图像的灰度版本)。
根据到目前为止的答案,它看起来像是不能做其他直接编辑位图像素的图像。到目前为止,没有人向我解释为什么原来的代码不工作。
2条答案
按热度按时间zpjtge221#
这里有一个简单的解决方案,没有系统。绘图。位图和GDI。
它从保留alpha通道的原始BitmapSource的灰度转换缓冲区创建一个新的BitmapSource。该代码适用于通常的
PixelFormats.Bgra32
和PixelFormats.Pbgra32
,但可以轻松地适应其他格式。这样使用它:
bvpmtnay2#
我不确定是否有更简单或更有效的方法来实现这一点,但如果你不害怕一些低级的图像操作,这应该可以做到这一点。它将返回一个
BitmapSource
,给定一个表示PNG文件的流,你可以获得它,无论它是嵌入式资源还是其他什么。辅助方法:将PNG流转换为灰度的方法: