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

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

编辑:

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

解决方法:

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

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

这将是服务器上的负载:

>加载完整图像.对于3000×3000图像,这将是大约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"));

我们可以根据需要调整大图像的大小.在第一行中,我们只是按固定比例(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"));
上一篇:使用C#进行Tiff文件压缩


下一篇:c# – 在Windows 7 / .Net 4.0上将多页Tiff拆分为单个Tiff