TransparentBlt()で縮小表示するときのモード

[戻る]
NOR 2013/05/07(火) 17:23:05
APIのTransparentBlt()は、縮小表示も行うことができますが、
縮小された画像はジャギーが発生して、汚くなってしまいます。

TransparentBlt()で縮小表示するときに、
HDCに対してなにか設定はできないのでしょうか。

StretchBlt()で縮小表示を行うときは、
SetStretchBltMode()でHALFTONEを指定すれば綺麗になってくれるのですが、
TransparentBlt()の前にそれを指定しても、変化はありませんでした。

APIのSetStretchBltMode()の解説には、
「BLACKONWHITE と WHITEONBLACK は、TransparentBlt 関数では COLORONCOLOR に変換さ
れます。」
という記述があり、HALFTONEに関しては何も書かれていなかったので、
ちょっと期待していたのですが、反映されないようです。

よろしくお願いいたします。

AR 2013/05/07(火) 18:56:13
 COLORONCOLORとHALFTONEは、劣化の程度と速度が違うので、画像サイズによって分かり
にくいと思います。

 SetStretchBltMode()のモードの違いに関しては、こちらのサイトで、サンプルソース
に加えて画像の加工イメージが確認できます。
 ご参照ください。
http://www13.plala.or.jp/kymats/study/MULTIMEDIA/StretchBltMode.html

仲澤@失業者 2013/05/07(火) 19:13:59
むぅ。たしかにBLACKONWHITE、WHITEONBLACKはCOLORONCOLORに
変換されるとは書いてありますが、HALFTONEについては記述がありませんね。

1.一旦StretchBlt()で縮小してから(HALFTONEを使用)。
2.TransparentBlt()で透過処理を行う。

又は、

3.AlphaBlend()関数を試してみる。

ですかね。

NOR 2013/05/08(水) 09:56:35
ご意見ありがとうございます。
なお、

> APIのSetStretchBltMode()の解説には、

この部分、SetStretchBltMode()ではなくTransparentBlt()の解説でした。
失礼しました。

> COLORONCOLORとHALFTONEは、劣化の程度と速度が違うので、
> 画像サイズによって分かりにくいと思います。

今回の画像に関しては、写真などのものではなく、
ボタンやツールバーのなどに使うようなイラスト状のものなので、
縮小したときに大きくジャギーが発生してしまいます。
網目模様が飛び飛びになったり、輪郭線が消えたりしてしまいます。

> 1.一旦StretchBlt()で縮小してから(HALFTONEを使用)。
> 2.TransparentBlt()で透過処理を行う。

この方法だと、1の段階で、透過色の境界付近で透過色が混ざって、
透過色に近い色になってしまい、綺麗に透過処理されませんでした。

上記の原因は、原理的には理解しているつもりですが、
TransparentBlt()では回避不可能ということになりますでしょうか。

仲澤@失業者 2013/05/08(水) 11:29:40
>この方法だと、1の段階で、透過色の境界付近で透過色が混ざって、
>透過色に近い色になってしまい、綺麗に透過処理されませんでした。

予測はしてましたが、やはりそこが問題になるわけですね。
背景側の画像(又はベースとなるブラシ)が単純な場合は、
2、1、の様に逆の手順で回避できる可能性があります。
しかし、複雑な背景の場合はこの方法はだめかもしれません。

古いスレッドには追加発言できません。