如何使用C#以低分辨率形式提供高分辨率图像
试图使用300dpi tif图像在网络上显示。目前,当用户上传图片时,我正在动态创建缩略图。如果使用宽度为500x500px的高分辨率图像创建页面,我可以使用相同的功能在运行中将其转换为gif/jpg。什么是即将解决的jpg将被创建?如何使用C#以低分辨率形式提供高分辨率图像
编辑:
为了进一步解释的使用中,用户上传的图像为300dpi其是约3000x3000像素。用户正在使用这些图像创建将用于pdf打印的目录页面。当他们创建页面时,我们只需要72dpi的图像显示到屏幕上,但对于打印,需要300dpi的图像。很明显,他们不希望在页面上添加一个3000x3000px的图片,因此需要将其调整到正确的查看区域。 500x500px等
这归结为一个简单的图像调整大小。对DPI的讨论只是计算比例因子的辅助数据。
正如@Guffa所说,你应该在上传的时候这样做,以便你可以在你的查看器中提供静态图像。
这将是服务器上的负载:
- 加载完整图像。这将为您的3000x3000图像提供约27 MB的内存。
- 调整大小。洛特的数学很懒惰(仍然是CPU密集型)。
- 压缩。更多CPU +写入驱动器的成本。
由于您已经花时间生成缩略图,因此无需重复上述步骤1(请参阅代码)即可分摊该成本和此成本。
当图片上传后,我会建议分离一个线程来完成这项工作。这确实是Web服务器上的一项负担,但您唯一的选择就是投入第二台机器来执行这项工作。这将不得不最终完成。
下面是一些代码来完成这项工作。最重要的线是这些:
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中的Image类在72-DPI处创建的。但是DPI确实对浏览器没有任何意义 - 它只是使用尺寸500x500。
在Web上显示图像时,dpi(或更正确的ppi)设置无关紧要。这只是相关的像素大小。
您可以随时转换图像,但每次显示图像时,服务器都会非常忙碌。您应该创建用户上传图片时所需的尺寸。
你有什么问题?你说你制作了缩略图 - DPI不重要,如果它只是为了网络 - 有些不起作用? – 2009-04-16 00:55:21
我认为新的标题有点误导,不是吗?它让我感觉像Virtual Earth和Google Earth这样的东西可以拼凑出高分辨率的图像,并将其作为较小的图块提供。也许使用术语'缩放'或者沿着这些线可能会使它更相关? – 2009-04-16 01:41:28