C/C++ で 32 ビット RGBA イメージをスケーリングするコードを書いています。ある程度成功したいくつかの試みを書いたことがありますが、それらは遅く、最も重要なことは、サイズ変更された画像の品質が受け入れられないことです。
OpenGL (つまり、ビデオ カード) でスケーリングされた同じ画像とルーチンを比較したところ、品質が大きく異なります。私はGoogleコードを検索し、いくつかの光を当てると思われるもの(SDL、Allegro、wxWidgets、CxImage、GD、ImageMagickなど)のソースツリーを精査しましたが、通常、それらのコードは複雑であちこちに散らばっているか、いじられていますアセンブラであり、コメントはほとんどまたはまったくありません。また、ウィキペディアや他の場所で複数の記事を読みましたが、必要なものについて明確な説明が見つかりません。補間とサンプリングの基本的な概念は理解していますが、アルゴリズムを正しく理解するのに苦労しています。1 つのルーチンを外部ライブラリに依存したくないので、画像形式に変換して元に戻す必要はありません。それに、とにかく自分でそれを行う方法を知りたいです。:)
以前にスタック オーバーフローに関する同様の質問を見たことがありますが、実際にはこのように回答されていませんでしたが、正しい方向に私を微調整するのを手伝ってくれる人がそこにいることを願っています. たぶん、いくつかの記事や疑似コードを教えてください...私が学び、実行するのに役立つものなら何でも。
これが私が探しているものです:
- アセンブラはありません (複数の種類のプロセッサ用に非常に移植性の高いコードを書いています)。
- 外部ライブラリへの依存はありません。
- 私は主にスケール ダウンに関心がありますが、後でスケール アップ ルーチンも作成する必要があります。
- 結果の品質とアルゴリズムの明快さが最も重要です (後で最適化できます)。
私のルーチンは基本的に次の形式を取ります。
DrawScaled(uint32 *src, uint32 *dst,
src_x, src_y, src_w, src_h,
dst_x, dst_y, dst_w, dst_h );
ありがとう!
更新:明確にするために、画像をぼやけさせるダウンスケーリング用のボックスリサンプルよりも高度なものが必要です。私が望むのは、バイキュービック アップスケーリング アルゴリズムとは逆の、ある種のバイキュービック (またはその他の) フィルターであると思います (つまり、各宛先ピクセルは、物事をシャープに保つ重み付けアルゴリズムと組み合わせて、寄与するすべてのソース ピクセルから計算されます。
例
これは、wxWidgets BoxResample アルゴリズムから取得したものと、55x55 にスケーリングされた 256x256 ビットマップで必要なものの例です。
- www.free_image_hosting.net/uploads/1a25434e0b.png
そして最後に:
- www.free_image_hosting.net/uploads/eec3065e2f.png
元の 256x256 画像