Сохранение Windows.Media.Drawing с BmpBitmapEncoder черное изображение - как удалить альфа?

Я использую SVG # ( http://sharpvectors.codeplex.com/) для пакетного преобразования файлов SVG в другие форматы. Конвертируемые изображения SVG представляют собой черные линии без фона. У меня мало опыта работы с WPF или пространством имен System.Windows.Media, поэтому извините, если это основной вопрос.

Я использую модифицированную версию ImageSvgConverter из SVG#, которая принимает System.Windows.Media.Drawing объект, который затем преобразуется с помощью System.Windows.Media кодировщик (BmpBitmapEncoder, PngBitmapEncoder и т. д.) для экспорта в нужный формат файла.

Когда я экспортирую, используя либо TiffBitmapEncoderor, PngBitmapEncoder или же GifBitmap изображения генерируются как ожидалось. Все сгенерированные изображения имеют прозрачный фон.

Тем не менее, когда я экспортирую с помощью JpegBitmapEncoder или же BmpBitmapEncoder Все изображения получаются черными. Так как все tif, png и gif имеют прозрачный фон, я думаю, что изображения jpg / bmp отрисовываются правильно, однако, поскольку альфа не поддерживается в этих форматах файлов, наличие черного вывода имеет смысл, так как прозрачность будет интерпретироваться как ничего / черный

Я думаю, что это так, как описано в этих SO сообщениях Странный вывод BMP Black из BitmapSource - есть идеи?, Преобразование прозрачного PNG в JPG с не черным цветом фона и фон становится черным при сохранении растрового изображения - C#.

Тем не менее, я не вижу способа применения решений, если эти посты касаются моей проблемы. Может кто-то указать мне верное направление?

Я попытался применить белый SolidColorBrush к методу PushOpacityMask DrawingContext, однако это не имеет значения.

Действительно ценю любые указатели.

        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;
    }

1 ответ

Решение

Вы можете нарисовать заполненный "фон" прямоугольник с соответствующим размером до фактического drawing объект.

using (var drawingContext = drawingVisual.RenderOpen())
{
    drawingContext.DrawRectangle(Brushes.White, null, new Rect(drawingBounds.Size));
    drawingContext.DrawDrawing(drawing);
}
Другие вопросы по тегам