如何使用C#以低分辨率forms提供高分辨率图像

尝试使用300dpi tif图像在网络上显示。 目前,当用户上传图片时,我正在动态创建缩略图。 如果创建的页面引用宽度为500x500px的高分辨率图像,我是否可以使用相同的function即时转换为gif / jpg。 什么是即将解决的jpg将被创建?

编辑:

为了进一步解释该用法,用户上传了大约3000×3000像素的300dpi图像。 用户正在使用这些图像来创建将用于pdf打印的目录页面。 当他们创建页面时,我们只需要72dpi图像显示在屏幕上,但是对于打印,需要300dpi图像。 显然,他们不想在页面上添加3000x3000px图像,因此需要将其调整到正确的查看区域,例如500x500px等。

这归结为简单的图像resize。 对DPI的讨论只是计算比例因子的辅助数据。

正如@Guffa所说,您应该在上传时执行此操作,以便您可以在查看器中提供静态图像。

这将是服务器上的负载:

  1. 加载完整图像。 对于3000×3000图像,这将是大约27 MB的内存。
  2. 调整。 很多数学懒散(仍然是CPU密集型)。
  3. 压缩。 更多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")); 

如果我明白你想要什么 – 你正在尝试制作一个非常高分辨率的gif或jpg缩略图,用于网页显示 – 如果没有,我提前道歉….


如果您希望缩略图为500x500px,那就是您要创建的jpg / gif的分辨率 – 500×500,或至少500x <500或<500x500(除非您想要扭曲的图像,否则要放入框中)。

要在网络上显示,DPI无关紧要。 只需使用您想要的像素分辨率即可。

从技术上讲,JPG / GIF是由.NET中的Image类在72-DPI创建的。 但DPI对浏览器没有任何意义 – 它只使用尺寸500×500。

在Web上显示图像时,dpi(或更正确的ppi)设置无关紧要。 它只是像素的大小相关。

您可以动态转换图像,但每次显示图像时服务器都需要这么做。 您应该在用户上传图像时创建所需的尺寸。