32ビットカラーの合成 – プログラミング – Home

通知
すべてクリア

[解決済] 32ビットカラーの合成


dicson
 dicson
(@dicson)
ゲスト
結合: 14年前
投稿: 45
Topic starter  

argb(a,b,c,d)の上にargb(e,f,g,h)の色を合成した結果はどうなりますか?

自己のアルゴリズムですが問題点はありますか?
クラスCOLORのメンバ関数です

COLOR Merge(COLOR s){
BYTE Alpha1=s.A();
BYTE Alpha2=255-s.A();
BYTE Alpha3=this->A();
BYTE Alpha=Alpha1+Alpha2*Alpha3/256;
if(Alpha==0)
return COLOR(0,0,0,0);
return COLOR(Alpha,
(s.R()*Alpha1+this->R()*Alpha2*Alpha3/256)/Alpha,
(s.G()*Alpha1+this->G()*Alpha2*Alpha3/256)/Alpha,
(s.B()*Alpha1+this->B()*Alpha2*Alpha3/256)/Alpha);
}


引用未解決
トピックタグ
hirocco
 hirocco
(@hirocco)
ゲスト
結合: 14年前
投稿: 138
 

/256ってあってますか?
クラスCOLORのコンストラクタから察すると,メンバに透明度を持ってるみたいですけど
透明度を持ってるなら,透明度が0でも色は保持してたほうがいいんじゃないかなぁ
operator COLORREFとかで初めてRGBにも影響させたほうがいいような気がしちゃいまし

よくわかってないのでこんな感じです


返信引用
subaru
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

背景と前景の両方にアルファ値があるということはさらに背景が存在するということで、
まず背景のRGBと前景のARGBの合成だけを考えればよいのでは?
その合成結果と背景をもう一度元のアルファ値で合成してやればよいような気がします。

hiroccoさんも書かれていますがアルファ値が0~255の範囲なら分母も255ですね。
変数が何を表しているかわかりませんがアルファ値が0でも処理を分ける必要はないで
しょう。


返信引用
ryo
 ryo
(@ryo)
ゲスト
結合: 23年前
投稿: 252
 

画像同士の合成は、
「いかなるときにも通用する方法」だとか「みんなが使ってる」とか
そんな「正しいとされる合成方法」があるのではなく
合成させる人が「自分なりの条件にあわせ、やりたい方法で合成」するもんだと思う


返信引用
dicson
 dicson
(@dicson)
ゲスト
結合: 14年前
投稿: 45
Topic starter  

みなさん、ありがとうございます。
GDIでの使用は考えていません。DIBでの使用です。

hiroccoさん、subaruさん、/256でなく/255でした。ありがとうございました。
subaruさん、32ビットビットマップを扱おうと考えているのでそういうわけにはいかないの
ですが。。具体的にどのような処理で合成するのでしょうか?
ryoさん、正しいとされる合成方法はないのでしょうか?


返信引用
subaru
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

うーん・・・GDI+での動作を調べてみるとアルファ同士が重なる場合は
ちゃんと透明度が下がるように作られているように見えますね。
どのような計算が行われているのかはわかりませんでしたけど。。。

描画を全て自前でやるのは速度を出すのが難しいと思うのだけど
何か環境的な制約でもあるのでしょうか?


返信引用
dicson
 dicson
(@dicson)
ゲスト
結合: 14年前
投稿: 45
Topic starter  

GDI+が遅いので自前描画を試みています。


返信引用
デゴルガン
 デゴルガン
(@デゴルガン)
ゲスト
結合: 16年前
投稿: 20
 

自分の過去のソースから

(a0 r0 g0 b0) と (a1 r1 g1 b1) を合成する
すべて 0 - 1.0 の小数値(事前に 255 で割っています)
my は 50% の合成なら 0.5

double a = a0 * (1.0 - my) + a1 * (my);
double r = a ? (a0 * r0 * (1.0 - my) + a1 * r1 * (my)) / a : 0;
double g = a ? (a0 * g0 * (1.0 - my) + a1 * g1 * (my)) / a : 0;
double b = a ? (a0 * b0 * (1.0 - my) + a1 * b1 * (my)) / a : 0;

合っているか分かりませんが、アルファ値も考慮した合成です。


返信引用
ryo
 ryo
(@ryo)
ゲスト
結合: 23年前
投稿: 252
 

もし、AlphaBlendと同じことがしたいということなら
http://msdn.microsoft.com/en-us/library/dd183393.aspx
ここが参考になると思う


返信引用
dicson
 dicson
(@dicson)
ゲスト
結合: 14年前
投稿: 45
Topic starter  

デゴルガンさん、ありがとうございました。参考になります。
ryoさん、ありがとうございました。そのサイトを参考にします。

とりあえず実装してみますので、問題があれば別スレ立てます。


返信引用
dicson
 dicson
(@dicson)
ゲスト
結合: 14年前
投稿: 45
Topic starter  

チェックぬけました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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