当前位置 : 首页 » 互动问答 » 正文

使用洋红色背景的位图在WPF中显示为透明

分类 : 互动问答 | 发布时间 : 2018-04-27 15:57:31 | 评论 : 1 | 浏览 : 35 | 喜欢 : 0

我正在将15年前的一些旧版软件转换成WPF格式,其图形通常是一些具有洋红色背景的8位位图,如下所示:

Transparency test

使用Gdi32作为透明键时常见的方法是使用洋红色绘制图形。使用 System.Drawing 时,它将是一个单行,即 _myImg.MakeTransparent(Color.Magenta)。但WPF呢?对于上述场景,甚至还有标准练习这样的东西吗?

我真的希望这可以在盒子外面工作:

 <Image Width =“128”>
        <Image.Source>
            <BitmapImage UriSource =“Media \ opacityTest.bmp”/>
        </Image.Source>
        <Image.OpacityMask>
            <SolidColorBrush Color =“Magenta”/>
        </Image.OpacityMask>
    </图像>

唉,尽管它是允许的,但它什么也不做:

The result

我是否错过了某些东西,或者这在WPF中是不可能的?

最终,我可能必须编写代码将这些位图转换为透明PNG,并加载它们。如果是这样,有没有人知道任何资源可以帮助我从Gdi +中完成这项工作?

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

回答(1)

  • 1楼
  • 我最终创建了一个基于原始图像和一个颜色键的新图像(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(像素,步幅,0);
    
        for(var i = 0; i <stride * img.PixelHeight; i + = 4)
            如果(Color.FromRgb(像素[i + 2],像素[i + 1],像素[i])== maskColor)
                for(var j = i; j <i + 4; j ++)
                    像素[j] = 0;
    
        返回BitmapSource.Create(
            img.PixelWidth,img.PixelHeight,
            img.DpiX,img.DpiY,
            格式,
            空值,
            像素,
            步幅);
    }
    

    它不使用 System.Drawing 因此不需要Gdi +,它只是修改像素数组,替换指定的maskColor,其预乘alpha rgb值设置为0.

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

    结果:

    enter image description here

相关阅读: