Сохранение 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);
}