【发布时间】:2019-10-13 08:00:20
【问题描述】:
我有一个 WPF 应用程序,我想将 Canvas 保存到具有正确 DPI 值的文件中。画布尺寸是真实的物理尺寸,例如。 20x10 厘米,300 DPI,所以是 2362x1181。
我使用 DrawingVisual 绘制图像和形状,然后创建 RenderTargetBitmap。 rtb 的大小就是 Canvas 的大小。 dpiX 和 dpiY 是 96。我只有 96 DPI 才能获得正确的图像分辨率。当我将它设置为 300 时,画布变得高档,并裁剪为 2362x1181。所以,不好。我尝试通过dpi因子修改画布宽度和高度值,但也没有工作。
在 RenderTargetBitmap 之后,我使用 BitmapEncoder、BitmapFrame 和 BinaryWriter。请参阅下面的代码。工作得很好,但图像 DPI 值将是 96。我已经阅读了大量关于读取 DPI、重新保存图像、使用 SetResolution 的主题,但我不想降低质量,我不想读取文件并重新保存它,我不想改变像素宽度/高度等。
我真的很想用给定的 DPI 保存一个 DrawingVisual。我可以为“X 分辨率”(uint=282)和“Y 分辨率”(uint=283)编写 EXIF 数据,但这不会影响图像 DPI 设置,例如。 Photoshop 将读取 96,而不是 300。
BitmapEncoder encoder = new JpegBitmapEncoder();
BitmapFrame bFrame = BitmapFrame.Create(rtb, null, meta, icc);
encoder.Frames.Add(bFrame);
using (var stream = new MemoryStream())
{
encoder.Save(stream);
byte[] imageData = stream.ToArray();
using (FileStream fs = new FileStream(path, ...)
{
BinaryWriter bw = new BinaryWriter(fs);
bw.Write(imageData);
bw.Close();
}
}
【问题讨论】: