TransparentBlt()で縮小表示するときのモード – プログラミング – Home

通知
すべてクリア

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


NOR
 NOR
(@NOR)
ゲスト
結合: 23年前
投稿: 128
Topic starter  

APIのTransparentBlt()は、縮小表示も行うことができますが、
縮小された画像はジャギーが発生して、汚くなってしまいます。

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

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

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

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


引用解決済
トピックタグ
AR2
 AR2
(@ar2)
Estimable Member
結合: 5年前
投稿: 110
 

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

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


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

むぅ。たしかにBLACKONWHITE、WHITEONBLACKはCOLORONCOLORに
変換されるとは書いてありますが、HALFTONEについては記述がありませんね。

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

又は、

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

ですかね。


返信引用
NOR
 NOR
(@NOR)
ゲスト
結合: 23年前
投稿: 128
Topic starter  

ご意見ありがとうございます。
なお、

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

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

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

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

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

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

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


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました