0

ビットマップのコラージュをプレビューとしてレンダリングする必要があるユース ケースがあります。アプリケーションは MVC ベースの REST サービスとして実装されており、私はごく普通の実装をしています。

using (var bitmap = new Bitmap((int)maxWidth, (int)maxHeight))
{
using (var graphic = Graphics.FromImage(bitmap))
{
    graphic.InterpolationMode = InterpolationMode.HighQualityBicubic;

    // now again for each mod
    foreach (var mod in mods)
    {
        var frame = frames.First(f => f.Index == mod.FrameIndex);
        var fileInfo = GetFileInfo(mod);
        using (var modImage = Image.FromFile(fileInfo.FullName))
        {
            graphic.DrawImage(modImage, (int)frame.Left, (int)frame.Top);
        }
    }

    bitmap.Save(previewFileName);
}
}

このコードは正常に動作しますが、パフォーマンスは非常に低くなります (特に大きな画像の場合)。私はサードパーティのライブラリも使用することにオープンです。より高速なソリューションが必要なだけです。

どんな助けでも大歓迎です。

アップデート

ユースケースを明確にするために、キャッシングは役に立ちません。これらの画像は顧客がアップロードした後、選択したコラージュのプレビューを要求します。遅いのはコラージュへの画像の書き込みです。

4

3 に答える 3

0

Netflix のように静的な数のサムネイルがある場合、サムネイルのビットマップを保持するキャッシュをメモリ内に作成します。これは、静的オブジェクトの場合もあります。サムネイルを生成したら、再度生成する必要はありません。毎回叩くためのより速いハンマーを見つけようとするよりも、よりクリーンなアプローチになります。

例 :

if(MyThumbnailImageDictionary["whateverimageId"] != null)
   return (Bitmap)MyThumbnailImageDictionary["whateverimageId"];

ユーザーがランダムに画像をアップロードするなど、サムネイルが動的である場合、画像キャッシュのサイズが非常に大きくなるため、この方法は役に立ちません。

次のコードを使用してサムネイルを生成できますが、どれほど高速になるかはわかりません。

 Image image = Image.FromFile(fileName);
 Image thumb = image.GetThumbnailImage(120, 120, ()=>false, IntPtr.Zero);
于 2013-08-27T23:31:32.973 に答える