2017-01-12 3 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), который является прозрачным черным.

Или ваш холст не совпадает с размером изображения (создайте свое изображение с жесткой кодировкой шириной &, а не используйте ширину и высоту вашего холста). Поскольку он больше, он отображает только те части, на которых на самом деле покрывает холст.

Если это первый случай, попробуйте установить холст Background = «White» на ваш холст, чтобы он отображал все его без прозрачности. Если это второе, попробуйте создать Rectangle размеры вашего изображения с соответствующим Fill = «White» и рендерингом, который сначала перед вашим холстом. Что-то вроде этого:

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

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

Некоторые советы, вы не должны реально использовать ширину и высоту, они могут быть NAN для контроля, что это расположение определяется его родителей. Фактически вы должны использовать Canvas.ActualWidth и Canvas.ActualHeight или Canvas.RenderSize.Width/Height. Это будет фактически отражать размер экрана на все время.

Кроме того, чтобы рассчитать размер вашего выходного изображения регулировочный для выбора DPI вы можете использовать следующее:

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

Это на самом деле хорошо, и это решает проблему, проблема была у меня был граница (что я забыл о) вокруг холста (холст на самом деле размер изображения xD), поэтому, когда я заполняю границу белым, на самом деле это трюк! Tnx alot! – MicroDev

+0

Без проблем, я боролся с экспортом изображений/скриншотов всю неделю и только что попал в эту точную проблему! – Joe