WPF - 以 jpeg 格式保存 Canvas 的黑色背景

标签 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 编码器时,这不会发生。任何人都可以发光吗? 如何删除黑色矩形或通过增加图片尺寸来填充它?

最佳答案

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

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

如果是第一种情况,请尝试将您的 Canvas Background="White"设置为您的 Canvas ,这样它就可以在不透明的情况下呈现所有 Canvas 。如果是第二个,请尝试使用适当的 Fill="White"创建一个 Rectangle 图像的尺寸,并首先在 Canvas 之前渲染它。像这样:

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

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

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

此外,要根据您的 DPI 选择计算输出图像的大小,您可以使用以下方法:

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

关于WPF - 以 jpeg 格式保存 Canvas 的黑色背景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41622893/

相关文章:

c# - 理解 MVVM 中的分离

android - 使用 1 Mb 堆的奇怪位图

python - 如何将 Canvas 内容转换为图像?

c# - 从生成的位图图像创建视频 C#

尝试读取解码的 Base64 jpeg 时,Android 位图工厂返回 null

android - 测量可绘制对象的大小(内存)

wpf - Background "Red"中的字符串="Red"如何转换为SolidColorBrush?

WPF 样式 : how to change GradientStop Color in Trigger

wpf - 绑定(bind)到 WPF ToggleButton 的 IsChecked 状态

android - 在 Android 上使用 JPEG 作为背景而不是 PNG