这归结为一个简单的图像调整大小。DPI 的讨论只是计算比例因子的辅助数据。
正如@Guffa 所说,您应该在上传时执行此操作,以便您可以在查看器中提供静态图像。
这将是服务器上的负载:
- 加载完整图像。对于 3000x3000 图像,这将是大约 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"));
我们可以根据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"));