4

Web での表示に 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 サーバーに負荷がかかりますが、他の選択肢は、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"));
于 2009-04-16T00:57:37.260 に答える
0

あなたが何を望んでいるのか理解できたら - ウェブ表示用に非常に高解像度の tif の gif または jpg サムネイルを作成しようとしています - そうでない場合は、事前にお詫び申し上げます....


サムネイルを 500x500px にしたい場合、それは作成したい jpg/gif の解像度です - 500x500、または少なくとも 500x<500 または <500x500 (歪んだ画像が必要でない限り、ボックスに収まるように)。

Web での表示の場合、DPI は重要ではありません。希望するピクセル解像度を直接使用してください。

于 2009-04-15T23:37:35.610 に答える
0

技術的には、JPG/GIF は .NET の画像クラスによって 72-DPI で作成されます。しかし、DPI はブラウザーにとって実際には何の意味もありません。500x500 のサイズを使用するだけです。

于 2009-04-15T23:41:47.113 に答える
0

Web 上に画像を表示する場合、dpi (より正確には ppi) の設定は関係ありません。関連するのはピクセル単位のサイズだけです。

その場で画像を変換できますが、画像が表示されるたびにサーバーがそれを行うのは非常に手間がかかります。ユーザーが画像をアップロードするときに必要なサイズを作成する必要があります。

于 2009-04-15T23:45:01.850 に答える