C# 使带有洋红背景的位图在WPF中显示为透明

C# 使带有洋红背景的位图在WPF中显示为透明,c#,wpf,xaml,color-key,C#,Wpf,Xaml,Color Key,我正在将一些已有15年历史的遗留软件转换为WPF,其图形通常是一些带有洋红背景的8位位图,类似这样: 在Gdi32中,通常使用洋红作为透明键来绘制图形。使用System.Drawing时,它将是一个单线,即\u myImg.MakeTransparent(Color.Magenta)。但是WPF呢?对于上述场景,是否有标准实践 我真的希望这能开箱即用: 唉,虽然这是允许的,但它什么也做不了: 在WPF中,我是否遗漏了什么或这是不可能的 最终,我可能需要编写代码将这些位图转换成透明的PNG

我正在将一些已有15年历史的遗留软件转换为WPF,其图形通常是一些带有洋红背景的8位位图,类似这样:

在Gdi32中,通常使用洋红作为透明键来绘制图形。使用
System.Drawing
时,它将是一个单线,即
\u myImg.MakeTransparent(Color.Magenta)
。但是WPF呢?对于上述场景,是否有标准实践

我真的希望这能开箱即用:


唉,虽然这是允许的,但它什么也做不了:

在WPF中,我是否遗漏了什么或这是不可能的

最终,我可能需要编写代码将这些位图转换成透明的PNG,将它们缓存到某个地方,然后加载它们。如果是这样,除了Gdi+,还有谁知道有什么资源可以帮助我实现这一点


还有一个类似的问题:。但是没有明确的答案(或者我真的不太相信这是不可能的)。

我最终根据原始图像和颜色键创建了一个新图像(32位pargb),下面是代码:

BitmapSource MakeTransparent(BitmapSource img, Color maskColor)
{           
    var format = PixelFormats.Pbgra32;
    var stride = ((img.PixelWidth * format.BitsPerPixel + 31) & ~31) >> 3;
    var pixels = new byte[img.PixelHeight * stride];

    img.CopyPixels(pixels, stride, 0);

    for (var i = 0; i < stride * img.PixelHeight; i += 4)
        if (Color.FromRgb(pixels[i + 2], pixels[i + 1], pixels[i]) == maskColor)
            for (var j = i; j < i + 4; j++)
                pixels[j] = 0;

    return BitmapSource.Create(
        img.PixelWidth, img.PixelHeight,
        img.DpiX, img.DpiY,
        format,
        null,
        pixels,
        stride);
}
BitmapSource使透明(BitmapSource img,彩色maskColor)
{           
var format=PixelFormats.Pbgra32;
变量步长=((img.PixelWidth*format.BitsPerPixel+31)和~31)>>3;
var像素=新字节[img.PixelHeight*步长];
图像复制像素(像素,步幅,0);
对于(变量i=0;i
它不使用
System.Drawing
,因此不需要Gdi+,它只需修改像素阵列,将指定的
maskColor
替换为预乘alpha rgb值设置为0

用法示例:
TestImage=MakeTransparent(新的位图图像(新的Uri(@“opacityTest.bmp”,UriKind.Relative)),Colors.Magenta)

结果是:


不透明面具是完全不同的东西。带上你最喜欢的图像编辑器,用一个像素值替换品红色,并用零alpha值。@Clemens如果可能的话,我会的-这些图像是可配置的,并存储在数据库中,被许多平台上的许多其他应用程序使用-不幸的是,我无法更改图像,我只能更改我的应用程序。当然,您可以始终加载System.Drawing.Bitmap并将其转换为WPF BitmapSource。您可以在StackOverflow上找到许多示例。@Usman确实如此,但我不推荐jpg,因为它是一种有损格式,并且您的背景可能有压缩伪影,这些伪影将在输出图像中可见。