4

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

编辑:

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

4

4 回答 4

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"));
于 2009-04-16T00:57:37.260 回答
0

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


如果您希望缩略图为 500x500 像素,那就是您要创建的 jpg/gif 的分辨率 - 500x500,或至少 500x<500 或 <500x500(以适合框,除非您想要扭曲的图像)。

对于在 Web 上显示,DPI 无关紧要。只需直接使用您希望的像素分辨率即可。

于 2009-04-15T23:37:35.610 回答
0

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

于 2009-04-15T23:41:47.113 回答
0

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

您可以即时转换图像,但每次显示图像时服务器都需要进行大量工作。您应该在用户上传图像时创建所需的尺寸。

于 2009-04-15T23:45:01.850 回答