如何设置透明PNG(WPF)的背景颜色?

时间:2011-02-14 04:38:08

标签: wpf png transparent

我正在加载一些图像(jpg,bmp,png等),进行一些操作,并将它们再次保存为jpg图像。当我用透明背景保存PNG图像时,它们以黑色背景保存,我真的更喜欢它是白色的。有没有办法做到这一点?

重要的是,这是产品中的“无UI”例程,因此在彻底改变工作方式时,我没有太多的余地。当然必须有'设置背景=白色'或什么?

我的代码的简短片段......

// Load the image
var image = new BitmapImage();
image.BeginInit();        
image.CacheOption = BitmapCacheOption.None;
image.UriSource = "SomeImage.png";
image.EndInit();


// Some manipulation of the image here...
image.Shake().Twist().ThrowItAllAbout();


// Save it back out, in a different format
using (FileStream stream = new FileStream("SomeOtherFile.jpg", FileMode.Create))
{
    var encoder = new JpegBitmapEncoder();
    encoder.Frames.Add(BitmapFrame.Create((BitmapSource)image));
    encoder.Save(stream);
}

2 个答案:

答案 0 :(得分:2)

我试图直接替换透明像素(使用WriteableBitmap CopyPixels / WritePixels),但这不适用于半透明像素(例如,阴影会产生黑色轮廓伪像)。

所以我决定在保存前将图像绘制在白色矩形的顶部。 它运作得很好:

public static BitmapSource ReplaceTransparency(this BitmapSource bitmap, Color color)
{
    var rect = new Rect(0, 0, bitmap.PixelWidth, bitmap.PixelHeight);
    var visual = new DrawingVisual();
    var context = visual.RenderOpen();
    context.DrawRectangle(new SolidColorBrush(color), null, rect);
    context.DrawImage(bitmap, rect);
    context.Close();

    var render = new RenderTargetBitmap(bitmap.PixelWidth, bitmap.PixelHeight,
        96, 96, PixelFormats.Pbgra32);
    render.Render(visual);
    return render;
}

用法:

var white = bitmap.ReplaceTransparency(Colors.White);
var enc = new JpegBitmapEncoder();
enc.Frames.Add(BitmapFrame.Create(white));
using (var fs = File.Create(filename))
    enc.Save(fs);

答案 1 :(得分:1)

没有简单的方法,当你说透明的PNG将以黑色背景保存时,你会做出一些错误的假设,而不是所有PNG的情况都是如此,它完全取决于用于保存PNG。

如果你制作一个完全透明的像素,并不一定要清除它的所有颜色,那么像素仍然有三个颜色通道,例如: IPU的图片肯定包含颜色信息,如果您使用代码转换该图像,您将会看到它。

将所有完全透明的像素设置为白色的一种方法是将所有像素设置为字节数组,检查每个像素的alpha通道,如果为0,则将该像素的每个其他通道设置为255。