これは、単純な画像のサイズ変更に要約されます。DPI の説明は、倍率を計算するための補助的なデータにすぎません。
@Guffa が言ったように、ビューアで静止画像を提供できるように、アップロード時にこれを行う必要があります。
これはサーバーの負荷になります。
- 完全なイメージをロードします。これは、3000x3000 の画像に対して約 27 MB のメモリになります。
- サイズを変更します。多くの計算が遅延して行われます (まだ CPU を集中的に使用します)。
- 圧縮します。より多くの CPU + ドライブへの書き込みコスト。
既にサムネイルの生成に時間がかかっているため、上記の手順 1 を繰り返さなくても、そのコストとこのコストを償却できます (コードを参照)。
画像がアップロードされたら、スレッドをスピンオフしてこの作業を行うことをお勧めします。これは確かに Web サーバーに負荷がかかりますが、他の選択肢は、2 台目のマシンを作業の実行に専念させることだけです。それは最終的に行われなければならないでしょう。
ここに仕事をするためのいくつかのコードがあります。重要な行は次のとおりです。
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) だけ縮小しています。2 行目では、画像の最終的な最大サイズを 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"));