0

我正在使用 SVG# ( http://sharpvectors.codeplex.com/ ) 将 SVG 文件批量转换为其他格式。被转换的 SVG 图像是没有背景的黑色线条图。我对 WPF 或 System.Windows.Media 命名空间几乎没有经验,所以如果这是一个基本问题,请原谅。

我正在使用来自 SVG# 的 ImageSvgConverter 的修改版本,它接受一个 System.Windows.Media.Drawing对象,然后使用System.Windows.Media编码器(BmpBitmapEncoderPngBitmapEncoder)将其转换为所需的文件格式。

当我使用 a 导出时TiffBitmapEncoderorPngBitmapEncoder 或者GifBitmap图像按预期生成。生成的图像都有透明背景。

但是,当我使用JpegBitmapEncoderor导出时BmpBitmapEncoder,所有图像都变黑了。由于 tif、png 和 gif 都具有透明背景,我认为 jpg / bmp 图像被正确绘制,但是,由于这些文件格式不支持 alpha,因此具有黑色输出是有意义的,因为透明度会被解释什么都没有/黑色。

我认为这与这些 SO 帖子中所述来自 BitmapSource 的奇怪 bmp 黑色输出 - 有什么想法吗?将透明PNG转换为具有非黑色背景颜色的JPG,并且在保存位图时背景变为黑色-C#

但是,我看不到将这些帖子应用于我的问题的方法。谁能指出我正确的方向?

我尝试将白色 SolidColorBrush 应用于 DrawingContext 的 PushOpacityMask 方法,但是,这没有区别。

非常感谢任何指示。

        private Stream SaveImageFile(Drawing drawing)
    {
        // black output
        BitmapEncoder bitmapEncoder = new BmpBitmapEncoder(); 

        // works
        //bitmapEncoder  = new PngBitmapEncoder();

        // The image parameters...
        Rect drawingBounds = drawing.Bounds;
        int pixelWidth = (int)drawingBounds.Width;
        int pixelHeight = (int)drawingBounds.Height;
        double dpiX = 96;
        double dpiY = 96;

        // The Visual to use as the source of the RenderTargetBitmap.
        DrawingVisual drawingVisual = new DrawingVisual();
        DrawingContext drawingContext = drawingVisual.RenderOpen();

        // makes to difference - still black
        //drawingContext.PushOpacityMask(new SolidColorBrush(System.Windows.Media.Color.FromRgb(255,255,255)));

        drawingContext.DrawDrawing(drawing);
        drawingContext.Close();

        // The BitmapSource that is rendered with a Visual.
        RenderTargetBitmap targetBitmap = new RenderTargetBitmap(pixelWidth, pixelHeight, dpiX, dpiY, PixelFormats.Pbgra32);

        targetBitmap.Render(drawingVisual);

        // Encoding the RenderBitmapTarget as an image file.
        bitmapEncoder.Frames.Add(BitmapFrame.Create(targetBitmap));

        MemoryStream stream = new MemoryStream();
        bitmapEncoder.Save(stream);
        stream.Position = 0;
        return stream;
    }
4

1 回答 1

2

drawing您可以在实际对象之前绘制一个具有适当大小的填充“背景”矩形。

using (var drawingContext = drawingVisual.RenderOpen())
{
    drawingContext.DrawRectangle(Brushes.White, null, new Rect(drawingBounds.Size));
    drawingContext.DrawDrawing(drawing);
}
于 2013-01-16T15:29:46.683 回答