ユーザーのアップロードしたイメージのサイズを変更するためのWebサービスを作成しましたが、機能上は正常に動作しますが、使用するたびにCPU使用率が急上昇します。 Windows Server 2008 64ビット版で動作しています。私は32と64ビットにコンパイルしようとしており、ほぼ同じ結果を得ています。C#と.NET 3.5のイメージのサイズ変更の効率
サービスの心は、この機能である:私はサービス上でプロファイラを入れて、それが時間の大半はGDI +ライブラリ自体に費やされている指示するように見えたし、あまりありません
private Image CreateReducedImage(Image imgOrig, Size NewSize)
{
var newBM = new Bitmap(NewSize.Width, NewSize.Height);
using (var newGrapics = Graphics.FromImage(newBM))
{
newGrapics.CompositingQuality = CompositingQuality.HighSpeed;
newGrapics.SmoothingMode = SmoothingMode.HighSpeed;
newGrapics.InterpolationMode = InterpolationMode.HighQualityBicubic;
newGrapics.DrawImage(imgOrig, new Rectangle(0, 0, NewSize.Width, NewSize.Height));
}
return newBM;
}
私のコードで得ることができます。
質問: ここで私のコードでは驚くほど非効率的なことをしていますか?私が見た例に従っているようです。
GDI +以外のライブラリを使用することで得られる利益はありますか?私が見てきたベンチマークは、GDI +が他のライブラリとよく似ていることを示しているようですが、十分に自信を持って見つけられませんでした。
「安全でないコード」ブロックを使用することで得られる利益はありますか?
私がコードを十分に含んでいないかどうか教えてください...私は要望どおりに置くことができますが、投稿に不快感を与えたくはありません。
タイトなループでこれを実行すると、入力/出力イメージのサイズで処理できるイメージの数はいくつですか? –
コードの一部の画像サイズ変更をローカルで実行すると、45秒間に1000画像のサイズを変更できます。 873x655を入力し、300x250にサイズ変更してトリミングします。 –
何か間違っています。 [ASP.NET用のImageResizerライブラリ](http://imageresizing.net)はGDI +を内部的に使用し、スループットが大幅に向上しています。 I/Oが処理される方法が原因であると思われます.Image/Bitmapインスタンスを作成する前にファイルストリームをメモリにバッファリングすると、並行性の欠陥がなくなります。 –