WPF C#中PNG资源图片转灰度后如何保留透明通道?
WPF C#编程实现PNG转灰度并保留透明通道的问题
我需要在WPF C#应用中,通过编程方式将PNG资源图片转为灰度图的同时保留透明通道。
我已创建最小可测试项目,仓库已更新并加入两种现有解决方案——转换后透明通道得以保留,但灰度效果和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>
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, };
这段C#代码里的OpacityMask = opacityMask并未生效,请问:
- 这段代码为什么达不到XAML的效果?
- 如何修改C#代码,实现和XAML完全一致的灰度转换+保留透明通道的效果?
目前临时解决方案是直接使用预生成的灰度版本图片作为资源,但现有回答都只提到直接编辑像素的实现方式,没人解释原代码失效的原因。
内容的提问来源于stack exchange,提问作者Atiris
相关产品推荐
相关产品推荐

