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

时间:2009-04-15 23:33:15

标签: c# image-processing image-manipulation tiff

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

修改

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

4 个答案:

答案 0 :(得分:6)

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

正如@Guffa所说,你应该在上传时这样做,这样你就可以在你的观众中提供静态图像。

这将是服务器上的负载:

  1. 加载完整图像。对于3000x3000图像,这将是大约27 MB的内存。
  2. 调整。很多数学懒散(仍然是CPU密集型)。
  3. 压缩。更多CPU +写入驱动器的成本。
  4. 由于您已经花时间生成缩略图,因此您无需重复上述步骤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"));
    

答案 1 :(得分:0)

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


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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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