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


HSPTV!掲示板


未解決 解決 停止 削除要請

2017
1127
はる画像加工について11解決


はる

リンク

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



この記事に返信する


Tsuyoshi

リンク

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 // ここの処理を最後にする

とすると、明暗の調整ができます。



Tsuyoshi

リンク

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



KA

リンク

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

散らかしてしまいすいません
色々教えていただけたので整理して完成させます
皆さま何度ありがとうございます
それでは



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