質問

Web 上での表示に 300dpi の tif 画像を使用しようとしています。現時点では、ユーザーが画像をアップロードすると、動的にサムネイルが作成されます。幅 500x500px の高解像度画像を参照してページが作成されている場合、同じ機能を使用してその場で gif/jpg に変換できますか。作成されるjpgの解像度はどれくらいですか?

編集:

使用法をさらに説明すると、ユーザーは約 3000x3000 ピクセルの 300dpi 画像をアップロードします。ユーザーはこれらの画像を使用して、PDF 印刷に使用されるカタログ ページを作成しています。ページを作成するときは、画面に表示するために 72dpi の画像だけが必要ですが、印刷には 300dpi の画像が必要です。明らかに、彼らは 3000x3000 ピクセルの画像をページに追加したくないので、正しい表示領域にサイズ変更する必要があります。500x500pxなど

役に立ちましたか?

解決

これは結局のところ、単純な画像のサイズ変更になります。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"));

他のヒント

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


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

Web 上での表示の場合、DPI は関係ありません。必要なピクセル解像度を直接使用してください。

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top