2009-04-15 135 views
4

试图使用300dpi tif图像在网络上显示。目前,当用户上传图片时,我正在动态创建缩略图。如果使用宽度为500x500px的高分辨率图像创建页面,我可以使用相同的功能在运行中将其转换为gif/jpg。什么是即将解决的jpg将被创建?如何使用C#以低分辨率形式提供高分辨率图像

编辑:

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

+0

你有什么问题?你说你制作了缩略图 - DPI不重要,如果它只是为了网络 - 有些不起作用? – 2009-04-16 00:55:21

+0

我认为新的标题有点误导,不是吗?它让我感觉像Virtual Earth和Google Earth这样的东西可以拼凑出高分辨率的图像,并将其作为较小的图块提供。也许使用术语'缩放'或者沿着这些线可能会使它更相关? – 2009-04-16 01:41:28

回答

6

这归结为一个简单的图像调整大小。对DPI的讨论只是计算比例因子的辅助数据。

正如@Guffa所说,你应该在上传的时候这样做,以便你可以在你的查看器中提供静态图像。

这将是服务器上的负载:

  1. 加载完整图像。这将为您的3000x3000图像提供约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")); 
0

如果我理解你想要的 - 你试图做一个非常高的分辨率TIF的GIF或JPG缩略图,对于Web显示 - 如果不是,我提前道歉....


如果你要的缩略图是500x500px,那就是JPG/GIF的分辨率,你需要创建 - 500×500,或至少500倍< 500或500×500 <(以适应在框中,除非你想扭曲的图像)。

为了在网络上显示,DPI无关紧要。只需使用您希望直接使用的像素分辨率。

0

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

0

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

您可以随时转换图像,但每次显示图像时,服务器都会非常忙碌。您应该创建用户上传图片时所需的尺寸。