WPF - 黑色背景围绕保存的画布作为jpeg

时间:2017-01-12 21:00:59

标签: wpf bitmap jpeg encoder

我在使用JpegBitmapEncoder时遇到了困难,因为它正在创建一个放置在黑色矩形中的图像。我没有解决方案。

 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 Encoder时,这不会发生。任何人都能发光吗? 如何删除黑色矩形或者通过增加图片的尺寸来填充它?

1 个答案:

答案 0 :(得分:2)

.png支持透明度,而.jpg则不支持透明度。我怀疑画布的背景是透明的,因为它不知道如何处理它只是保留像素默认(0,0,0),即黑色。 Png默认为(0,0,0,0),它是透明的黑色。

或者,您的画布与图像尺寸不同(您使用硬编码的宽度和高度创建图像,而不是使用画布的宽度和高度)。因为它更大,它只渲染画布实际覆盖的部分。

如果是第一种情况,请尝试将画布背景=“白色”设置为画布,以使其全部呈现为没有透明度。如果是第二个,请尝试使用适当的Fill =“White”创建图像尺寸Rectangle并在画布前首先渲染。像这样:

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

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

一些建议,你不应该真正使用宽度和高度,这些可以是NAN用于控件,其布局由其父级决定。您实际应该使用Canvas.ActualWidthCanvas.ActualHeightCanvas.RenderSize.Width/Height。这实际上会反映屏幕尺寸。

另外,要计算调整DPI选项的输出图像的大小,可以使用以下内容:

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