如何使用 C# 以低分辨率形式提供高分辨率图像
-
09-09-2019 - |
题
尝试使用 300dpi tif 图像在网络上显示。目前,当用户上传图像时,我正在动态创建缩略图。如果创建的页面引用宽度为 500x500px 的高分辨率图像,我可以使用相同的功能即时转换为 gif/jpg 吗?将创建的 jpg 的即将分辨率是多少?
编辑:
为了进一步解释用法,用户上传了约 3000x3000 像素的 300dpi 图像。用户正在使用这些图像创建将用于 pdf 打印的目录页面。当他们创建页面时,我们只需要 72dpi 的图像即可显示在屏幕上,但打印时需要 300dpi 的图像。显然他们不想向页面添加 3000x3000px 图像,因此需要将其大小调整到正确的查看区域,例如500x500 像素等
解决方案
这归结为简单的图像大小调整。DPI 的讨论只是计算比例因子的辅助数据。
正如@Guffa 所说,您应该在上传时执行此操作,以便您可以在查看器中提供静态图像。
这将是服务器上的负载:
- 加载完整图像。对于 3000x3000 图像来说,这大约需要 27 MB 的内存。
- 调整大小。大量的数学运算是懒惰地完成的(仍然是 CPU 密集型的)。
- 压缩。更多 CPU + 写入驱动器的成本。
由于您已经花时间生成缩略图,因此您可以通过不必重复上面的步骤 1 来分摊该成本和此成本(请参阅代码)。
上传图像后,我建议分出一个线程来完成这项工作。这肯定会增加网络服务器的负载,但您唯一的选择就是使用第二台计算机来执行这项工作。它最终必须完成。
这是完成这项工作的一些代码。重要的几行是:
OutputAsJpeg(Resize(big, 300.0, 72.0), new FileStream("ScreenView.jpg"));
OutputAsJpeg(Resize(big, bigSize, 64.0), new FileStream("Thumbnail.jpg"));
我们可以调整大小 big
我们需要的图像。在第一行中,我们只是将其缩小固定比例 (72.0 / 300.0)。在第二行,我们强制图像的最终最大尺寸为 64(比例因子 = 64.0 / 3000.0)。
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.IO;
BitmapSource Resize(BitmapSource original,
double originalScale,
double newScale) {
double s = newScale / originalScale;
return new TransformedBitmap(original, new ScaleTransform(s, s));
}
void OutputAsJpeg(BitmapSource src, Stream out) {
var encoder = new JpegBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(src));
encoder.Save(out);
}
// Load up your bitmap from the file system or whatever,
// then dump it out to a smaller version and a thumbnail.
// Assumes thumbnails have a max dimension of 64
BitmapSource big = new BitmapImage(new Uri("BigPage0.png",
UriKind. RelativeOrAbsolute));
double bigSize = Math.Max(big.PixelWidth, big.PixelHeight);
OutputAsJpeg(Resize(big, 300.0, 72.0), new FileStream("ScreenView.jpg"));
OutputAsJpeg(Resize(big, bigSize, 64.0), new FileStream("Thumbnail.jpg"));
其他提示
如果我明白你想要什么 - 你试图做一个非常高的分辨率TIF的GIF或JPG缩略图,对于Web显示 - 如果不是,我提前道歉......
如果您要的缩略图是500x500px,那就是JPG / GIF的分辨率,你需要创建 - 至少500倍500×500,或<500或<500×500(以适应在框中,除非你想扭曲图像)。
有关在网络上显示,所述DPI没有关系。只需使用你希望直接像素分辨率。
技术上JPG / GIF由.NET映像类在72-DPI创建。但DPI真的没有任何意义的浏览器 - 它只是采用了500×500尺寸
当一个网络上显示图像,所述DPI(或更正确ppi)的设置无关。这只是在象素中的尺寸是相关的。
您可以即时将图像转换,但它是非常密集的工作,为服务器做,每次显示图像。您应该创建大小,你需要在用户上传图像。