2017-01-12 7 views
2

JpegBitmapEncoder에서 검은 사각형으로 배치 된 이미지를 만들기 때문에 문제가 있습니다. 나는 해결책을 찾지 못했다.WPF - 검은 색 배경으로 저장된 캔버스를 jpeg로 둘러 쌉니다.

private void SaveImage(Canvas canvas, string fileName) 
    { 
     SaveFileDialog s = new SaveFileDialog(); 
     s.FileName = "Pic"; 
     s.DefaultExt = ".jpg"; 
     s.Filter = "JPG files (.jpg)|*.jpg"; 

     Nullable<bool> result = s.ShowDialog(); 
     if (result == true) 
     { 
      RenderTargetBitmap renderBitmap = new RenderTargetBitmap(6646, 3940, 2000d, 2000d, PixelFormats.Pbgra32); 

      canvas.Measure(new Size((int)canvas.Width, (int)canvas.Height)); 
      canvas.Arrange(new Rect(new Size((int)canvas.Width, (int)canvas.Height))); 

      renderBitmap.Render(canvas); 

      string filename = s.FileName; 
      JpegBitmapEncoder encoder = new JpegBitmapEncoder(); 
      encoder.Frames.Add(BitmapFrame.Create(renderBitmap)); 

      using (FileStream file = File.Create(filename)) 
      { 
       encoder.Save(file); 
      } 
     } 
    } 
내가 얻을이 코드

:

enter image description here

을하지만 난 PngBitmap 인코더를 사용할 때이 발생하지 않습니다. 빛을 비출 수있는 사람이 있습니까? 검은 색 직사각형을 제거하거나 그림의 크기를 늘려서 채우려면 어떻게해야합니까?

답변

2

.png은 투명도를 지원하지만, .jpg은 투명성을 지원하지 않습니다. 저는 캔버스의 배경이 투명하다고 의심합니다. 그걸로 무엇을 해야할지 모르기 때문에 픽셀을 기본값 (0,0,0) 즉 검은 색으로 남겨 둡니다. PNG의 기본값은 (0, 0, 0, 0)이며 투명 검정색입니다.

캔버스의 크기가 이미지와 같지 않습니다 (캔버스의 폭과 높이를 사용하지 않고 너비가 & 인 하드 코드 이미지를 만듭니다). 크기가 클수록 캔버스가 실제로 덮는 부분 만 렌더링합니다.

첫 번째 경우 캔버스 배경 = "흰색"을 캔버스에 설정하여 투명도가없는 모든 캔버스를 렌더링하십시오. 두 번째 인 경우 적절한 채우기 = "흰색"을 사용하여 이미지의 크기를 Rectangle으로 만들고 캔버스 앞에 렌더링하십시오. 이런 식으로 뭔가가 :

Rectangle fillBackground = new Rectangle { 
    Width = 6646, 
    Height = 3940, 
    Fill=Brushes.White 
} 

renderBitmap.Render(fillBackground); 
renderBitmap.Render(canvas); 

조언, 당신이 정말로 폭과 높이를 사용해서는 안,이는 부모의에 의해 레이아웃이 결정의 컨트롤에 대한 NAN을 할 수 있습니다. 실제로는 Canvas.ActualWidthCanvas.ActualHeight 또는 Canvas.RenderSize.Width/Height을 사용해야합니다. 이것은 실제로 화면 크기를 항상 반영합니다. 또한

, 당신은 다음과 같은 사용할 수있는 DPI 선택을 위해 조정하여 출력 이미지의 크기를 계산 :

RenderTargetBitmap renderBitmap = new RenderTargetBitmap(Width * DPI/96, 
                 Height * DPI/96, 
                 DPI, DPI, PixelFormats.Pbgra32); 
+0

이 실제로 좋은, 그리고이 문제를 해결, 문제는 (내가 테두리를 가지고 있었다 그 캔버스 주위에 캔버스 (실제로 캔버스는 xD 그림의 크기입니다), 그래서 내가 흰색으로 국경을 채울 때, 그것은 실제로 트릭을 않습니다! Tnx 많이! – MicroDev

+0

아무런 문제없이 필자는 일주일 내내 이미지/스크린 샷을 내보내는 데 어려움을 겪었으므로이 정확한 문제에 부딪혔습니다. – Joe