これは単純な画像のサイズ変更になります。 DPIの議論は、倍率を計算するための補助データにすぎません。
@ Guffa氏によると、アップロード時にこれを行うと、ビューアに静的な画像を表示できるだけです。
これは、サーバの負荷になります。
- は、完全なイメージをロードします。これは、3000x3000イメージの場合、約27 MBのメモリになります。
- サイズ変更。遅れて行われた数学のロット(依然としてCPU集中型)。
- 圧縮。より多くのCPU +ドライブへの書き込みコスト。
既にサムネイルの生成に時間が掛かっているため、上記の手順1(コードを参照)を繰り返す必要がないため、そのコストとこのコストを償却することができます。
画像がuplaodedされた後、私はこの仕事をするためにスレッドをスピンオフをお勧めします。それは確かに、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"));
問題が発生している部分は何ですか?あなたはサムネイルを作ったと言いました.DPIはウェブ用であれば問題ありません。何か問題がありますか? –
新しいタイトルはちょっと誤解していると思いますか?それは、Virtual EarthやGoogle Earthのようなものを高解像度の画像を並べて、より小さなタイルとして扱うようにします。おそらく、用語「スケーリング」やそれらの線に沿った何かを使用すると、それはより適切なものになるでしょうか? –
イメージのサイズ変更がこの用語になると思います。 http://imageresizing.netライブラリは、このシナリオ用に特別に設計されています。無料でオープンソースでスケーラブルです。 –