HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2007
0513
ます色を混ぜる11解決


ます

リンク

2007/5/13(Sun) 22:34:01|NO.8232

2つの色を混ぜあわせたいのですが、RGBの平均値を取るだけだと
変な結果になってしまいます。
どうすれば上手く色を混ぜられるのでしょうか。
一応今のスクリプトです。

#define color_r(%1,%2,%3,%4) %1_r=%2:%1_g=%3:%1_b=%4 #define color_copy(%1,%2) %1_r=%2_r:%1_g=%2_g:%1_b=%2_b #define colorr(%1) color %1_r,%1_g,%1_b color_r color1,255,0,0 color_r color2,0,0,255 gosub *byoga onclick gosub *onc onkey goto *a stop *byoga colorr color1 boxf 0,0,ginfo_winx>>1,ginfo_winy colorr color2 boxf ginfo_winx>>1,0,ginfo_winx,ginfo_winy return *onc dialog ,33 if mousex<ginfo_winx/2:color_copy color1,ginfo:else:color_copy color2,ginfo gosub *byoga return //色を混ぜる *a onclick 0:onkey 0 color_r mixcolor,(color1_r+color2_r)/2,(color1_g+color2_g)/2,(color1_b+color2_b)/2 colorr mixcolor boxf stop
よろしくお願いします。



この記事に返信する


PCオタ

リンク

2007/5/13(Sun) 23:17:16|NO.8233

はじめまして、PCオタといいます。
久しぶりに投稿。

色を混ぜる計算は面倒だから、本当に混ぜてそこから色をとる。

dim ac,3:dim bc,3:dim cc,3 ac(0)=255:ac(1)=0:ac(2)=0 bc(0)=0:bc(1)=0:bc(2)=255 gmode 3,10,10,255 color ac(0),ac(1),ac(2) grect gmode 3,10,10,127 color bc(0),bc(1),bc(2) grect pget 0,0 cc(0)=ginfo_r:cc(1)=ginfo_g:cc(2)=ginfo_b pos 0,12 mes "R:"+cc(0)+"G:"+cc(1)+"B:"+cc(2)

それっぽくなってるので、結果重視な感じ。



ハテナ

リンク

2007/5/14(Mon) 16:48:25|NO.8241

> RGBの平均値を取るだけだと変な結果になってしまいます。

PCオタさんのやり方と比べて見たら、平均値でもちゃんと出来ている様です。
おそらくますさんのスクリプトは、
複雑なマクロがかみ合わずに計算を誤ったのかも知れません。

#enum R=0 #enum G #enum B //初期値 c1=255,0,0 c2=0,0,255 //簡易カラーパレット buffer 1,127,191 repeat 191 :c=cnt repeat 127 hsvcolor c,cnt*2,255 :pset c,cnt loop loop gsel 0 *main redraw 0 //クリック取得 stick key,256+512 if key=256 :pget mousex,mousey :c1=ginfo_r,ginfo_g,ginfo_b if key=512 :pget mousex,mousey :c2=ginfo_r,ginfo_g,ginfo_b //色混ぜる c3(R) = ( c1(R) + c2(R) ) / 2 c3(G) = ( c1(G) + c2(G) ) / 2 c3(B) = ( c1(B) + c2(B) ) / 2 //画面初期化+パレット表示 color 255,255,255 :boxf gmode 0 :pos 0,0 :gcopy 1,0,0,127,191 //それぞれの色を表示 color c1(R),c1(G),c1(B) :boxf 150,0,250,80 color c2(R),c2(G),c2(B) :boxf 150,100,250,180 color c3(R),c3(G),c3(B) :boxf 300,0,400,180 //gmode+grect で色を混ぜる gmode 3,100,180,255 :color c1(R),c1(G),c1(B) :grect 500,90 gmode 3,100,180,127 :color c2(R),c2(G),c2(B) :grect 505,95 //それぞれの色の値表示 color pos 150,80 :mes "c1="+c1(R)+","+c1(G)+","+c1(B) pos 150,180 :mes "c2="+c2(R)+","+c2(G)+","+c2(B) pos 300,180 :mes "c3="+c3(R)+","+c3(G)+","+c3(B) //gmode+grect の色の値を取得して表示 pget 455,5 pos 450,190 :mes "gmode+grect="+ginfo_r+","+ginfo_g+","+ginfo_b redraw 1 wait 10 goto *main



ます

リンク

2007/5/14(Mon) 18:13:21|NO.8243

ありがとうございます。
しかし、これでは
黄+青=灰色という結果になってしまいます。



f

リンク

2007/5/14(Mon) 19:25:03|NO.8247

・・・黄に青を足したら、何色になるのが正しいの?



ます

リンク

2007/5/14(Mon) 20:09:15|NO.8250

一応緑です。



離反者

リンク

2007/5/14(Mon) 20:43:59|NO.8252

> 一応緑です。

あれ・・・白じゃないですか?



Shinya

リンク

2007/5/14(Mon) 20:57:35|NO.8253

>一応緑です。
そうでしたか?

黄色に青混ぜると・・・
黄色には赤の要素が混ざってるから緑にはならないと思います。
緑を作るのなら、黄色から赤の要素を抽出(取り出し)しなければなりません。

>黄+青=灰色という結果になってしまいます。
色を4byteで管理するのがよいと思います。
RGBで3byte, そしてブレンド率を表す値を1byte使うのはどうでしょうか。

緑色と、青色でテストします。
	dialog "緑色と青色を混ぜます-↑↓でブレンド率設定"
// ブレンド値 (0〜255) α = 128 ; clr1 → RGB (use 3byte) poke clr1, 0, 0 ; R poke clr1, 1, 255 ; G poke clr1, 2, 0 ; B ; clr2 → RGB (use 3byte) poke clr2, 0, 0 ; R poke clr2, 1, 0 ; G poke clr2, 2, 255 ; B gosub *sub repeat stick k, 15, 1 : if k == 0 : wait 1 : continue if k & 2 : α++ : α = limit(α, 0, 255) if k & 8 : α-- : α = limit(α, 0, 255) gosub *sub loop *sub title "ブレンド率 = " + double(α)/255*100 + "%" R = (peek(clr1) + peek(clr2)) G = (peek(clr1, 1) + peek(clr2, 1)) B = (peek(clr1, 2) + peek(clr2, 2)) color double(α)/255*R, double(α)/255*G, double(α)/255*B boxf return



KIMU

リンク

2007/5/14(Mon) 21:14:12|NO.8254

>一応緑です。
それは・・・
黄色+青は普通「白」です
それを半分にしてるので灰色になるのは間違っていません。
緑は黄色と青が0にならないといけないので、足して割るだけでは無理です。

もしかして、色の設定ダイアログみたいな虹色の並びで2色間の色が欲しい?



GENKI

リンク

2007/5/14(Mon) 22:56:39|NO.8257

 ますさんが行っているのは「色(絵の具、色料)の三原色」で、他の皆さんが言っているのは「光の三原色」。
PCの世界で色といえば、光の三原色を指します。(ハードによる影響でしょうね。)
参考資料:http://ja.wikipedia.org/wiki/%E8%89%B2

 一般のペイントソフトになれていればすぐにわかることですが、知らない人はやっぱり知らないもんです。
世間一般では三原色といえば絵の具、色料の三原色の方がなじみがあり一般的。
といっても、プログラムの質問掲示板であるここにおいては光をさすのが普通ですが…。
まあ、どちらも間違っちゃいない、ということです。


 さて、ますさんがおっしゃる色の三原色の再現ですが、ちょっと調べてみました。
RGB←→CMYの変換式なんてのがありました。
http://image-d.isp.jp/commentary/color_cformula/CMY.html
いや、探せばあるもんですね…。ないと思いつつ探してました。(^ ^;

参考資料:http://ja.wikipedia.org/wiki/%E8%89%B2%E7%A9%BA%E9%96%93



ます

リンク

2007/5/16(Wed) 19:19:46|NO.8295

皆様、誤解する書き方をして申し訳ありませんでした。
GENKIさんの言うとおり色の三原色です。
GENKIさんのアドレスを参考にさせていただきます。
皆様、ありがとうございました。



uitilty9

リンク

2007/6/23(Sat) 19:23:12|NO.9089

#enum R=0
#enum G
#enum B
//初期値
c1=255,0,0
c2=0,0,255

//簡易カラーパレット
buffer 1,127,191
repeat 191 :c=cnt
repeat 127
hsvcolor c,cnt*2,255 :pset c,cnt
loop
loop
gsel 0

*main
redraw 0
//クリック取得
stick key,256+512
if key=256 :pget mousex,mousey :c1=ginfo_r,ginfo_g,ginfo_b
if key=512 :pget mousex,mousey :c2=ginfo_r,ginfo_g,ginfo_b
//色混ぜる
c3(R) = ( c1(R) + c2(R) ) / 2
c3(G) = ( c1(G) + c2(G) ) / 2
c3(B) = ( c1(B) + c2(B) ) / 2
//画面初期化+パレット表示
color 255,255,255 :boxf
gmode 0 :pos 0,0 :gcopy 1,0,0,127,191
//それぞれの色を表示
color c1(R),c1(G),c1(B) :boxf 150,0,250,80
color c2(R),c2(G),c2(B) :boxf 150,100,250,180
color c3(R),c3(G),c3(B) :boxf 300,0,400,180
//gmode+grect で色を混ぜる
gmode 3,100,180,255 :color c1(R),c1(G),c1(B) :grect 500,90
gmode 3,100,180,127 :color c2(R),c2(G),c2(B) :grect 505,95
//それぞれの色の値表示
color
pos 150,80 :mes "c1="+c1(R)+","+c1(G)+","+c1(B)
pos 150,180 :mes "c2="+c2(R)+","+c2(G)+","+c2(B)
pos 300,180 :mes "c3="+c3(R)+","+c3(G)+","+c3(B)
//gmode+grect の色の値を取得して表示
pget 455,5
pos 450,190 :mes "gmode+grect="+ginfo_r+","+ginfo_g+","+ginfo_b

redraw 1
wait 10
goto *main

はだめです!



ONION software Copyright 1997-2023(c) All rights reserved.