0

SVG 파일을 다른 형식으로 일괄 변환하기 위해 SVG # (http://sharpvectors.codeplex.com/)을 사용하고 있습니다. 변환중인 SVG 이미지는 배경이없는 검은 색 선 그림입니다. WPF 또는 System.Windows.Media 네임 스페이스에 대한 경험이 거의 없으므로 기본 질문 인 경우 실례합니다.BmpBitmapEncoder를 사용하여 Windows.Media.Drawing 저장 black image - 알파를 제거하는 방법?

나는 다음 원하는 파일 형식으로 수출하는 System.Windows.Media 인코더 (BmpBitmapEncoder, PngBitmapEncoder 등)를 사용하여 변환 된 System.Windows.Media.Drawing 객체를 받아 SVG 번호에서 ImageSvgConverter의 수정 된 버전을 사용하고 있습니다.

TiffBitmapEncoderor, PngBitmapEncoder 또는 GifBitmap 중 하나를 사용하여 내보낼 때 이미지가 예상대로 생성됩니다. 생성 된 이미지는 모두 투명한 배경을가집니다.

그러나 JpegBitmapEncoder 또는 BmpBitmapEncoder을 사용하여 내보낼 때 모든 이미지가 검은 색으로 표시됩니다. tif, png 및 gif는 모두 배경이 투명하기 때문에 jpg/bmp 이미지가 올바르게 그려지는 것으로 생각되지만 알파가 이러한 파일 형식에서는 지원되지 않으므로 검정 출력은 투명도가 해석 될 때 의미가 있습니다. 아무것도/검은 색으로.

이 게시물에 설명 된 것과 같습니다 Strange bmp black output from BitmapSource - any ideas?, Convert Transparent PNG to JPG with Non-Black Background ColorBackground Turns Black When Saving Bitmap - 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; 
    } 

답변

2

당신은 이전에 실제 drawing 객체에 적절한 크기로 채워진 "배경"사각형을 그릴 수 있습니다.

using (var drawingContext = drawingVisual.RenderOpen()) 
{ 
    drawingContext.DrawRectangle(Brushes.White, null, new Rect(drawingBounds.Size)); 
    drawingContext.DrawDrawing(drawing); 
} 
+0

나무가 나무를 볼 수 없었습니다! 완벽하게 일했고, 많이 감사했습니다. – Jack