質問


回答ありがとうございます,実際、私は1024 * 768ピクセルの描画が100 * 100ピクセルより遅いということに困惑していません...とても単純なロジックです。 私を困惑させたのは、DrawImageの補間アルゴリズムが非常に遅くなる可能性があり、多くのより良いアルゴリズムが存在し、そのデコーダは特定の解像度でjpgからデコードできるようだ、それは本当にクールです、私はいつか検索しますが、見つかりませんこれを行う無料のライブラリ...

本当に奇妙です! 以下のコードをPaintメソッドに追加します。 c:\ 1.jpgは5Mのjpgファイルで、約4000 * 3000です

// --------------------------------------------- -----------------

HDC hdc = pDC->GetSafeHdc();
bitmap = Bitmap::FromFile(L"c:\\1.jpg",true);
Graphics graphics(hdc);
graphics.SetInterpolationMode( InterpolationModeNearestNeighbor );
graphics.DrawImage(bitmap,0,0,200,200);

上記は非常に高速です!リアルタイムでも! 5mのJPGをデコードするのはそれほど速くないと思います!

// --------------------------------------------- -----------------

HDC hdc = pDC->GetSafeHdc();
bitmap = Bitmap::FromFile(L"c:\\1.jpg",true);
Graphics graphics(hdc);
graphics.SetInterpolationMode( InterpolationModeNearestNeighbor );
graphics.DrawImage(bitmap,0,0,2000,2000);

上記のコードは本当に遅くなります

// --------------------------------------------- -----------------

Bitmap = Bitmap :: FromFile(L" c:\ 1.jpg&quot ;, true);を追加した場合//コンストラクトへ

離れる

    Graphics graphics(hdc);
    graphics.SetInterpolationMode( InterpolationModeNearestNeighbor );
    graphics.DrawImage(bitmap,0,0,2000,2000);

OnPaintメソッドでは、 コードはまだ少し遅い~~~

// --------------------------------------------- ---------------------

デコードと比較して、drawImageプロセスは本当に遅い...

なぜ、どのようにしたのですか? Microsoftは、drawingImageの作成を担当する男性よりも、デコーダーの二重給与を担当する男性に支払いをしましたか?

役に立ちましたか?

解決

8倍に縮小する場合、JPGをデコードする必要はありません。JPG画像は、DCT変換された8 x 8ピクセルのブロックで構成されます。このブロックの平均値は、DCTの0,0係数です。したがって、8倍に縮小することは、他のすべてのコンポーネントを破棄するだけのことです。さらに縮小(たとえば4000-> 200)するのは、4000から500に縮小し、通常500から200ピクセルに縮小するだけです。

他のヒント

だから、あなたが本当に疑問に思っているのはなぜですか

graphics.DrawImage(bitmap,0,0,200,200);

より速い

graphics.DrawImage(bitmap,0,0,2000,2000);

正しいですか?

まあ、2番目のケースで100倍以上のピクセルを描画しているという事実は、それと何か関係があるかもしれません。

必要になるまでデコードが延期される可能性があります。それがとても速い理由です。

200x200の場合、GDI +は200x200をペイントするのに十分なブロックのみをデコードし、2000x2000ではさらにデコードします。

グラフィックルーチンには常にいくつかのあいまいな最適化が含まれています。

たぶんリフレクターが教えてくれますか?

推測ではありますが、4000x3000または2000x1500で描画してみてください。おそらく4000と3000が200で割り切れるという事実は全体を高速化し、200で割り切れない3000はそれを遅くします(これは本当に奇妙です)。

通常、プロファイリングまたは時間測定を行います。 2000x2000が200x200の約100倍遅い場合、すべて問題ありません。また、2000x2000が遅すぎる場合でも気にしないでください。画面が1024x768の場合、画像全体を見ることができないため、画面上に表示されている画像の一部を選択して描画すると、1024x768は2000x2000の5倍の速度になります。

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