You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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并未生效,请问:

  1. 这段代码为什么达不到XAML的效果?
  2. 如何修改C#代码,实现和XAML完全一致的灰度转换+保留透明通道的效果?

目前临时解决方案是直接使用预生成的灰度版本图片作为资源,但现有回答都只提到直接编辑像素的实现方式,没人解释原代码失效的原因。

内容的提问来源于stack exchange,提问作者Atiris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 16:20:17