|
|
|
2017/11/27(Mon) 05:22:39|NO.81916
全くの素人でcolorでRGBで足し引きすればいいのかな?と思い試していたのですが
加算減産してもどちらも黒くなってやっぱりおかしいなと思い質問します
pget,psetなので描くのも遅いですが
こんな感じで試してました
何を直したらいいでしょうか?
buffer 1,640,200,0
picload "hsp3ttl.jpg"
x_ichi=0
y_ichi=0
i=0
dim dot_r,129000
dim dot_g,129000
dim dot_b,129000
gsel 1
repeat 200
y_ichi=cnt
repeat 640
x_ichi=cnt
i=x_ichi+(y_ichi*640)
pget x_ichi,y_ichi
dot_r.i=ginfo_r
dot_g.i=ginfo_g
dot_b.i=ginfo_b
loop
loop
screen 0,640,200
gsel 0
gcopy 1,0,0,640,200
title ""+i+""
*main
redraw 0
stick k,5
if k&1 : {
repeat 200
y_ichi=cnt
repeat 640
x_ichi=cnt
i=x_ichi+(y_ichi*640)
dot_r.i-
dot_g.i-
dot_b.i-
color dot_r.i,dot_g.i,dot_b.i : pset x_ichi,y_ichi
if dot_r.i<0 : dot_r.i=0
if dot_g.i<0 : dot_g.i=0
if dot_b.i<0 : dot_b.i=0
loop
loop
i=0
}
if k&4 : {
repeat 200
y_ichi=cnt
repeat 640
x_ichi=cnt
i=x_ichi+(y_ichi*640)
dot_r.i+
dot_g.i+
dot_b.i+
color dot_r.i,dot_g.i,dot_b.i : pset x_ichi,y_ichi
if dot_r.i>255 : dot_r.i=255
if dot_g.i>255 : dot_g.i=255
if dot_b.i>255 : dot_b.i=255
loop
loop
i=0
}
redraw 1
await 1
goto *main
| |
|
2017/11/27(Mon) 09:36:19|NO.81917
color dot_r.i,dot_g.i,dot_b.i : pset x_ichi,y_ichi
上記描画部分は、dot_r.i, dot_g.i, dot_b.iの値が確実に0〜255の値になっているか確認してから
行わないといけないです。
プログラム中でその処理を行っているようですが、psetで描画した後に0未満と255以上の処理を直す
処理をおこなっているので、-1と256の不当な値がcolorに設定され、その部分の色がおかしくなって
います。
なので、
<暗くする処理>
// 現在の処理
color dot_r.i,dot_g.i,dot_b.i : pset x_ichi,y_ichi
if dot_r.i<0 : dot_r.i=0
if dot_g.i<0 : dot_g.i=0
if dot_b.i<0 : dot_b.i=0
↓↓↓下記のように直す
// 修正
if dot_r.i<0 : dot_r.i=0
if dot_g.i<0 : dot_g.i=0
if dot_b.i<0 : dot_b.i=0
color dot_r.i,dot_g.i,dot_b.i : pset x_ichi,y_ichi // ここの処理を最後にする
<明るくする処理>
// 現在の処理
color dot_r.i,dot_g.i,dot_b.i : pset x_ichi,y_ichi
if dot_r.i>255 : dot_r.i=255
if dot_g.i>255 : dot_g.i=255
if dot_b.i>255 : dot_b.i=255
↓↓↓下記のように直す
// 修正
if dot_r.i>255 : dot_r.i=255
if dot_g.i>255 : dot_g.i=255
if dot_b.i>255 : dot_b.i=255
color dot_r.i,dot_g.i,dot_b.i : pset x_ichi,y_ichi // ここの処理を最後にする
とすると、明暗の調整ができます。
|
|
2017/11/27(Mon) 10:11:59|NO.81918
すみません、NO.81917ですが、一部誤りが...
"0未満と255以上の処理"ではなく、"0未満と256以上の処理"です。
↓
プログラム中でその処理を行っているようですが、psetで描画した後に0未満と256以上の処理を直す
|
|
2017/11/27(Mon) 12:09:24|NO.81919
改善点についてはTsuyoshiさんが指摘されている通りなのですが、psetとpgetはかなり「遅い」命令なので、
gmodeで加算コピーや減算コピーを行う方法にしてみました。
#const ratio 4 //一回のキー入力で明るくor暗くする度合い
picload "hsp3ttl.jpg"
wid=ginfo_winx
hei=ginfo_winy
buffer 1,wid,hei : gsel 1
color ratio,ratio,ratio : boxf
gsel 0
repeat
inkey_flag=0
stick k,5
if k&1 : inkey_flag=2
if k&4 : inkey_flag=1
if inkey_flag { //inkey_flagが0以外の時実行。「if inkey_flag!=0」と同じ。
redraw 0
gmode 4+inkey_flag,,,100
pos 0,0 : gcopy 1,0,0,wid,hei
redraw 1
}
await 16
loop
|
|
2017/11/27(Mon) 19:15:48|NO.81920
お二方ありがとうございます
順番ですか!
初歩的なミスはよくやりますが、視野狭まると中々気づかないですあ汗
gmodeも普段使わなかったけど、いい機会なので重要視したいですね
画像ソフトなんかで色々セパレートやらモノクロやらエンボスとか色々ありますよね
考え方的にはどう考えたら良いでしょうか
今見たいに加算減算と言うか数値変えたり線を強調したりだとは思うのですが
やるのは本人のやりたい事やセンスなのもわかります
言い訳ばかりですいません
|
|
2017/11/27(Mon) 19:46:54|NO.81921
googleで「モノクロ化 アルゴリズム」とか「エンボス アルゴリズム」等と検索するとやり方は出てきます。
とりあえずエンボスを。
#const off 2
picload "hsp3ttl.jpg"
wid=ginfo_winx
hei=ginfo_winy
buffer 1,wid,hei : gsel 1
pos 0,0 : gcopy 0,0,0,wid,hei
//反転
repeat wid
cnt0=cnt
repeat hei
pget cnt0,cnt
color ginfo_r^255,ginfo_g^255,ginfo_b^255
pset cnt0,cnt
loop
loop
gsel 0
gmode 3,,,127
pos off,off
gcopy 1,0,0,wid,hei
|
|
2017/11/27(Mon) 19:56:41|NO.81922
おまけ。「psetとpgetは遅い」と言った手前、psetとpgetを使わずにVRAMに直接アクセスするバージョン。
#const off 2
#define ctype nnot(%1) ((%1)^0xFFFFFFFF) //%1のnotを返す
picload "hsp3ttl.jpg"
wid=ginfo_winx
hei=ginfo_winy
vram_wid=(wid*3+3)&nnot(3)
buffer 1,wid,hei : gsel 1
pos 0,0 : gcopy 0,0,0,wid,hei
mref vram,66
//反転
repeat hei
vram_wid0=cnt*vram_wid
repeat vram_wid
poke vram,vram_wid0+cnt,peek(vram,vram_wid0+cnt)^255
loop
loop
gsel 0
gmode 3,,,127
pos off,off
gcopy 1,0,0,wid,hei
|
|
2017/11/27(Mon) 23:27:48|NO.81923
ありがとうございます
アルゴリズムですか調べ方も学ばないとですね
そこは自分でちゃんと探してみます
度々すいません使い方のわからない所があるのですが
#const off 2
#define ctype nnot(%1) ((%1)^0xFFFFFFFF) //%1のnotを返す
pos off,off
マクロとか名前は聞いたことはありますが数値として使えるようにするとか聞きますが
詳しくわからないです
color ginfo_r^255,ginfo_g^255,ginfo_b^255
この部分の「 ^ 」これの使い方したことないので何を意味しているかわかりませんでした
当たり前の質問かもしれませんがよろしくお願いします
|
|
2017/11/28(Tue) 04:41:46|NO.81924
gmodeのサンプル見ていじってたのですが
白黒させたら画像塗りつぶしちゃって逆に戻そうとしたら戻せなくて
vramまだ理解できてはいませんが
pget,psetで今やって思ったのが数値いじれるほうでは超えた時に別の超えたカウンターを回して
カウンターがあった場合それを足し引きすれば復帰できるなとは思いました
gmodeだと黒にするとき赤み掛かってどうしてこうなるかわかりません
#const ratio 4 //一回のキー入力で明るくor暗くする度合い
wid=640
hei=200
buffer 1,wid,hei
picload "hsp3ttl.jpg"
buffer 2,wid,hei : gsel 2
color ratio,ratio,ratio : boxf
screen 0,wid,hei
gsel 0
repeat
pos 0,0 : gcopy 1,0,0,wid,hei
inkey_flag=0
stick k,5
if k&1 : inkey_flag=2
if k&4 : inkey_flag=1
if inkey_flag { //inkey_flagが0以外の時実行。「if inkey_flag!=0」と同じ。
redraw 0
gmode 4+inkey_flag,,,5
pos 0,0 : gcopy 2,0,0,wid,hei
redraw 1
}
await 16
loop
|
|
2017/11/28(Tue) 06:09:50|NO.81925
まず、自分で考えたスクリプトを完成させて、それを
他の処理に応用出来る様に成ってから、効率的な方法
に替えていった方が良いと思いますよ。
食い散らかしていると、肝心な処理の考え方がまとま
りません。
|
|
2017/11/28(Tue) 13:32:37|NO.81926
VRAMは一寸高度な処理なので、今は理解する必要はありませんよ。
(上に投稿したVRAMを使ったコードはあくまでもおまけなので)
constとdefineについては、マニュアルやヘルプを参照してください。
>color ginfo_r^255,ginfo_g^255,ginfo_b^255
>この部分の「 ^ 」これの使い方したことないので何を意味しているかわかりませんでした
xor演算子です。色コードは8ビットの数値であらわされるので、
255(ビットだと11111111)をxorすることで色を反転しています。
詳しくは「xor 反転」などで。
>gmodeだと黒にするとき赤み掛かってどうしてこうなるかわかりません
一回目のgcopyをキー入力関係なしに何度も行っているのに加え、
gmode 5なり6なりが一回目のgcopyにも適用されているせいです。
そのため、gmodeを0に戻し、キー入力があった時だけ描画を行うようにするようにします。
#const ratio 4 //明るくor暗くする度合い
level=0 //どのくらい明るくor暗くするか。プラスの場合は明るく、マイナスの場合は暗くする
buffer 1 : gsel 1
picload "hsp3ttl.jpg"
wid=ginfo_winx
hei=ginfo_winy
buffer 2,wid,hei : gsel 2
color 255,255,255 : boxf
screen 0,wid,hei
gsel 0
pos 0,0 : gcopy 1,0,0,wid,hei
repeat
inkey_flag=0
stick k,5
if k&1 : inkey_flag=1 : level=limit(level-ratio,-256,256)
if k&4 : inkey_flag=1 : level=limit(level+ratio,-256,256)
if inkey_flag {
redraw 0
gmode 0
pos 0,0 : gcopy 1,0,0,wid,hei
if level {
if level>0 : gmode 5,,,level : else : gmode 6,,,abs(level)
pos 0,0 : gcopy 2,0,0,wid,hei
}
redraw 1
}
await 16
loop
| |
|
2017/11/28(Tue) 19:36:11|NO.81927
散らかしてしまいすいません
色々教えていただけたので整理して完成させます
皆さま何度ありがとうございます
それでは
|
|