2010-11-22 1 views
4

ワークステーションのWin32 APIのGDI StretchBlt関数が、への倍率補間を行う場合には、誰でも明確にすることができますか? 24/32ビットカラーイメージの場合、そうでない場合は、これを行うGDI(ではなく GDI +)関数がありますか?宛先矩形内の画素のブロックにソース矩形からすべてのスケーリングでStretchBlt HALFTONE == BILINEARですか?

HALFTONE マップピクセル:

SetStretchBltMode FNは、以下のように記載されて設定HALFTONEを有しています。デスティネーションブロックのピクセルの平均カラーは、ソースピクセルのカラーに近似しています。

私はreferences (see follow-up to first answer)を見てきましたが、画像を縮小するときに双線形補間を実行しますが、拡大すると何が起こるかの明確な答えはありません。

私は、Windows Mobile CE SDK does support a BILINEAR flagがハーフトーンのコメントと正反対に文書化されていることに気付きました(スケールアップの場合のみ)。

この質問の範囲では、GDI +(多くの補間オプションがあります)、OpenGL、DirectXなどを選択肢にするのは興味がないので、これらについてのフォローアップは気にしないでください他のAPIまたは別のイメージライブラリ。

私が実際に探しているのは、Win32(デスクトップ)GDIの動作のこの動作を明確に文書化している確定的なMS/MSDNまたはその他の高品質ドキュメントです。

一方、GDIとDirect2D(これを制御する明示的なフラグが付いています)を比較し、私の知見を掲載してみます。

ありがとうございます!

+0

両方の機能を使用してビット深度の低いサーフェス、つまり1ビットサーフェスにレンダリングしようとするとどうなりますか? – SingleNegationElimination

+0

私もそれを試してみます。 HALFTONEを使用したスケールアップについての私の最初のテストは、確かにピクセルを平均化しているようです。 – holtavolt

+0

そして、同じテスト画像上でズームアップするとき、COLORONCOLORは予想される最近傍ピクセル化を明確に示します。 – holtavolt

答えて

0

ハーフトーン(HALFTONE)モードは、定義された四角に変換スレッショルドを変化させることに基づいて、画像に非常にぎざぎざなハーフトーンディザリングを実行します。私はそれが最善の選択とみなされる状況を見たことがありません。

カラー画像はカラーモードには最適ですが、見たように大きな効果はありません。

GDIはバイリニアモードをサポートしていません(Windows Mobile CEでは検出されません)。 bilinearの純粋な実装は、画像を縮小するときにはあまりうまく機能しません。これは、より広い領域から描画しようとせずに、2つの隣接する入力ピクセルの間を単に補間しようとするためです。

+2

私の場合、ソースとターゲットはともに24ビットカラーであり、画像はグレースケールです画像。 HALFTONEを使ってそのような画像の領域を拡大した私の実験では、結果は双線形のinterp(同じ画像上のCOLORONCOLORが明らかに最近隣であるため)であり、ディザリングの兆候はありません。つまり、私は文書化されていない振る舞いに依存したくないので、この振る舞いに一貫性があると考えることができなければ、別の解決策を見つけるでしょう。 – holtavolt

+0

@holtavolt、それはHALFTONEに関する非常に興味深い情報です。私の経験は非常に古く、おそらく24から24のコピーには関係しません。私はそれがまだ縮んだときに非常に良い結果を提供していないと思っている、あなたはそれを試していたかどうかを言及しなかった。 –

+0

実際には、24ビットのグレースケールについても縮んでも問題ないと思われます(おそらく双線形ですが、最も近いかもしれませんが、確かにImageMagickのようなものを使用する必要があります)。 – holtavolt

6

私は過去数週間この同じ問題を調査してきました。

私が知る限り、Microsoftからのこの動作についての明確なドキュメントは存在しません。

しかし、私は、StretchBltがハーフトーンモードで上下スケーリングイメージに関して一貫して実行することができる程度を試してみるために、いくつかのテストを自分で実行しました。

私の調査結果は以下のとおりです。

1)StretchBltは、適切な品質のアップとダウンスケールされた画像を生成しません。それはPhotoshopの品質の下のタッチかもしれませんが、おそらくほとんどの実用的な目的のためにOKです。

2)ハードウェアアクセラレーションに依存しているようです。私はこれを確認することができませんでしたが、これが異なるタイプのハードウェア上で異なる出力につながる可能性があるというわずかな恐れがあります。しかし、私が試した5つか6つの異なるシステムでは、古いものと新しいものがあり、パフォーマンスは一貫性があり高速です。

3)16ビットカラーデバイスでコールを使用する場合、StretchBltはイメージを自動的にディザリングします。 24ビットカラーデバイスで実行すると、ディザリングされません。

4)小さな画像(150x150pxより小さい)を拡大縮小するために使用すると、ランダムに最近隣の補間に戻ります。これは、スケーリングの前にビットマップをパディングし、その上でStretchBltを実行した後にパディングを削除することで、独自のソフトウェアで修正できます。ハックのようなものだが、うまくいく。

関連する問題