这归结为一个简单的图像调整大小。对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"));
你有什么问题?你说你制作了缩略图 - DPI不重要,如果它只是为了网络 - 有些不起作用? – 2009-04-16 00:55:21
我认为新的标题有点误导,不是吗?它让我感觉像Virtual Earth和Google Earth这样的东西可以拼凑出高分辨率的图像,并将其作为较小的图块提供。也许使用术语'缩放'或者沿着这些线可能会使它更相关? – 2009-04-16 01:41:28