2009-04-15 12 views
4

ウェブ上に表示するために300dpiのtif画像を使用しようとしています。現時点では、ユーザーが画像をアップロードするときに、私は動的にサムネイルを作成しています。幅500x500ピクセルの高解像度画像を参照してページを作成した場合、同じ機能を使用して、オンザフライでgif/jpgに変換できますか?作成されるjpgの差し迫った解決は何ですか?C#を使用して低解像度のフォームで高解像度画像を提供する方法

EDIT:

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

+0

問題が発生している部分は何ですか?あなたはサムネイルを作ったと言いました.DPIはウェブ用であれば問題ありません。何か問題がありますか? –

+0

新しいタイトルはちょっと誤解していると思いますか?それは、Virtual EarthやGoogle Earthのようなものを高解像度の画像を並べて、より小さなタイルとして扱うようにします。おそらく、用語「スケーリング」やそれらの線に沿った何かを使用すると、それはより適切なものになるでしょうか? –

+0

イメージのサイズ変更がこの用語になると思います。 http://imageresizing.netライブラリは、このシナリオ用に特別に設計されています。無料でオープンソースでスケーラブルです。 –

答えて

6

これは単純な画像のサイズ変更になります。 DPIの議論は、倍率を計算するための補助データにすぎません。

@ Guffa氏によると、アップロード時にこれを行うと、ビューアに静的な画像を表示できるだけです。

これは、サーバの負荷になります。

  1. は、完全なイメージをロードします。これは、3000x3000イメージの場合、約27 MBのメモリになります。
  2. サイズ変更。遅れて行われた数学のロット(依然としてCPU集中型)。
  3. 圧縮。より多くの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")); 
+0

ページの画像サイズを5~10に変更する可能性があります。 tifが17-30MBから激減する可能性があることを考慮すると、サーバーの負荷はいくらですか? – mickyjtwin

+0

このライブラリを開発したチームで働いていたので、私たちの実装は他のものと同じくらい速いと言えるでしょう。しかし、それはサーバー上の負荷になります。フルイメージを読み込み、サイズ変更、圧縮。それらはすべて高価です。スレッドを回転させて作業を行い、良いハードドライブがあることを確認してください –

+0

問題は、ユーザーが常に画像の幅と高さを要件に合わせて変更できることです。画像を72dpiのjpg(約100k、17MBから)に保存した場合はどうなりますか?これは動的に処理が速くなりますか? – mickyjtwin

0

私はあなたが望むものを理解していれば - あなたはウェブ表示のために、非常に高解像度のTIFのGIFまたはJPGサムネイルを作成しようとしている - ではない場合、私は事前に謝罪....


サムネイルを500x500pxにする場合は、作成するjpg/gifの解像度が500x500、または少なくとも500x < 500または< 500x500の解像度になります。歪んだ画像)。

ウェブ上に表示するには、DPIは関係ありません。ただあなたが直接望むピクセル解像度を使用してください。

0

技術的には、JPG/GIFは.NETのImageクラスによって72-DPIで作成されます。しかし、DPIは実際にはブラウザに何の意味も持たず、500×500の寸法しか使用していません。

0

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

あなたはその場で画像を変換することができますが、それは非常にたびに画像が表示されていることを実行するサーバーに対して集中的に動作されます。ユーザーがイメージをアップロードするときに必要なサイズを作成する必要があります。

関連する問題