APIのTransparentBlt()は、縮小表示も行うことができますが、
縮小された画像はジャギーが発生して、汚くなってしまいます。
TransparentBlt()で縮小表示するときに、
HDCに対してなにか設定はできないのでしょうか。
StretchBlt()で縮小表示を行うときは、
SetStretchBltMode()でHALFTONEを指定すれば綺麗になってくれるのですが、
TransparentBlt()の前にそれを指定しても、変化はありませんでした。
APIのSetStretchBltMode()の解説には、
「BLACKONWHITE と WHITEONBLACK は、TransparentBlt 関数では COLORONCOLOR に変換さ
れます。」
という記述があり、HALFTONEに関しては何も書かれていなかったので、
ちょっと期待していたのですが、反映されないようです。
よろしくお願いいたします。
COLORONCOLORとHALFTONEは、劣化の程度と速度が違うので、画像サイズによって分かり
にくいと思います。
SetStretchBltMode()のモードの違いに関しては、こちらのサイトで、サンプルソース
に加えて画像の加工イメージが確認できます。
ご参照ください。
http://www13.plala.or.jp/kymats/study/MULTIMEDIA/StretchBltMode.html
むぅ。たしかにBLACKONWHITE、WHITEONBLACKはCOLORONCOLORに
変換されるとは書いてありますが、HALFTONEについては記述がありませんね。
1.一旦StretchBlt()で縮小してから(HALFTONEを使用)。
2.TransparentBlt()で透過処理を行う。
又は、
3.AlphaBlend()関数を試してみる。
ですかね。
ご意見ありがとうございます。
なお、
> APIのSetStretchBltMode()の解説には、
この部分、SetStretchBltMode()ではなくTransparentBlt()の解説でした。
失礼しました。
> COLORONCOLORとHALFTONEは、劣化の程度と速度が違うので、
> 画像サイズによって分かりにくいと思います。
今回の画像に関しては、写真などのものではなく、
ボタンやツールバーのなどに使うようなイラスト状のものなので、
縮小したときに大きくジャギーが発生してしまいます。
網目模様が飛び飛びになったり、輪郭線が消えたりしてしまいます。
> 1.一旦StretchBlt()で縮小してから(HALFTONEを使用)。
> 2.TransparentBlt()で透過処理を行う。
この方法だと、1の段階で、透過色の境界付近で透過色が混ざって、
透過色に近い色になってしまい、綺麗に透過処理されませんでした。
上記の原因は、原理的には理解しているつもりですが、
TransparentBlt()では回避不可能ということになりますでしょうか。
>この方法だと、1の段階で、透過色の境界付近で透過色が混ざって、
>透過色に近い色になってしまい、綺麗に透過処理されませんでした。
予測はしてましたが、やはりそこが問題になるわけですね。
背景側の画像(又はベースとなるブラシ)が単純な場合は、
2、1、の様に逆の手順で回避できる可能性があります。
しかし、複雑な背景の場合はこの方法はだめかもしれません。