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


HSPTV!掲示板


未解決 解決 停止 削除要請

2008
0301
kotokoto指定色のみをコピー13解決


kotokoto

リンク

2008/3/1(Sat) 23:38:23|NO.13849

こんにちは。
いつも皆さんの書き込みにお世話になっております。

指定色以外のコピーはgmode 4で簡単にできるのですが、
指定色のみをコピーするにはどうしたら良いでしょうか…。
フルカラー画像から指定した色の部分だけを取り出したいのですが、
なかなかいいアイデアが出てこない…(>_<;)

何か良い方法がありましたら、ご教授お願いいたします。m(_ _)m



この記事に返信する


ANTARES

リンク

2008/3/2(Sun) 00:13:54|NO.13850

 mref ,66とpeek, pokeで地道にやるくらいでしょうか。



KENTA

リンク

2008/3/2(Sun) 00:32:32|NO.13852

ANTARESさんの言っている方法がもし難しいならば、
pset,pgetなどの命令を利用してしてみてください。



kotokoto

リンク

2008/3/2(Sun) 00:39:14|NO.13853

シンプルな処理なので、
peek&pokeで頑張ってみます!
ありがとうございました!(≧▽≦)ノ



inovia

リンク

2008/3/2(Sun) 01:18:27|NO.13855

もう解決してしまったようですが、一応。
psetとpgetを使ったやり方。
ただし、画像サイズが大きくなるとそれだけ遅くなりますが。
かなり地味な作業。

(画像とソースのダウンロード)
http://homepage2.nifty.com/MJHS/hsp/picture-test.lzh


fname="test2.bmp" picload fname,1 mes "元の画像" wait 300 color 255,255,255 boxf buffer 2,640,480 picload fname,1//バッファにコピー r=255 //R-この色を抽出(残す色R) g=0 //G-この色を抽出(残す色G) b=0 //B-この色を抽出(残す色B) fr=255 //R-当てはまらない場合この色で塗りつぶし fg=255 //G-当てはまらない場合この色で塗りつぶし fb=255 //B-当てはまらない場合この色で塗りつぶし gx=62// X画像サイズ gy=57// Y画像サイズ //gx=ginfo(10) //gy=ginfo(11) screen 0,640,480 title "色抽出中" dim rt,gx,gy dim gt,gx,gy dim bt,gx,gy gsel 2,1 xx=0:yy=0//調整 repeat gy xx=0 repeat gx pget xx,yy rt(xx,yy)=ginfo(16)//r gt(xx,yy)=ginfo(17)//g bt(xx,yy)=ginfo(18)//b //先に当てはまらない色を変更しておく if rt(xx,yy)!=r{ rt(xx,yy)=fr:gt(xx,yy)=fg:bt(xx,yy)=fb }else{ if gt(xx,yy)!=g{ rt(xx,yy)=fr:gt(xx,yy)=fg:bt(xx,yy)=fb }else{ if bt(xx,yy)!=b{ rt(xx,yy)=fr:gt(xx,yy)=fg:bt(xx,yy)=fb }else{ } } } xx+=1 if cnt\30=0:title ""+rt(xx,yy)+"."+bt(xx,yy)+"."+gt(xx,yy)+"/"+xx+","+yy //boxf 200,200,230,230 wait 0 loop wait 0 yy+=1 loop yy-=1:xx-=1//調整 title ""+rt(xx,yy)+"."+bt(xx,yy)+"."+gt(xx,yy)+"/"+xx+","+yy gsel 0,1 title "表示中" xx=0:yy=0//調整 repeat gy;y xx=0 repeat gx;x color rt(xx,yy),gt(xx,yy),bt(xx,yy) pset xx,yy if cnt\30=0:title ""+rt(xx,yy)+"."+bt(xx,yy)+"."+gt(xx,yy)+"/"+xx+","+yy xx+=1 wait 0 loop wait 0 yy+=1 loop yy-=1:xx-=1//調整 title ""+rt(xx,yy)+"."+bt(xx,yy)+"."+gt(xx,yy)+"/"+xx+","+yy



kotokoto

リンク

2008/3/2(Sun) 02:17:42|NO.13856

>>inoviaさん
ありがとうございます。
色々試してベストな方法を探してみます〜。(*^-^*)



kotokoto

リンク

2008/3/2(Sun) 04:10:02|NO.13857

とりあえずできた〜…けど、画像サイズが大きくなると、やっぱり厳しいですね。^^;
なんとか高速にしないとなぁ…。
もう少し考えてみます〜。



screen 0,640,480,0 ;コピー先画面 mref vram,66 wx=ginfo_winx : wy=ginfo_winy buffer 2,640,480,0 ;コピー元画面 picload "〜〜",1 mref vram2,66 x=100 ;コピー開始位置:x座標 y=100 ;コピー開始位置:y座標 w=100 ;コピーする幅 h=100 ;コピーする高さ tr_r=255 ;指定色の赤 tr_g=255 ;指定色の緑 tr_b=255 ;指定色の青 repeat h ypos=(wy-1-(y+cnt))*wx*3 repeat w vpos=(x+cnt)*3 + ypos bb=peek(vram2,vpos) ;青を取り出す if bb!=tr_b : continue gg=peek(vram2,vpos+1) ;緑を取り出す if gg!=tr_g : continue rr=peek(vram2,vpos+2) ;赤を取り出す if rr!=tr_r : continue poke vram,vpos,tr_b ;青色をコピー先に書き込む wpoke vram,vpos+1,tr_g*256+tr_r ;緑色と赤色をコピー先に書き込む loop loop



じった

リンク

2008/3/2(Sun) 07:53:14|NO.13858

すみません。

試さないで、思いつきだけで言ってみますが、

>指定色以外のコピーはgmode 4で簡単にできるのですが、

…ならば、『元画像』に、『指定色以外をコピーした画像』を

gmode6で、色減算コピーかけてみたらどうでしょう?



kotokoto

リンク

2008/3/2(Sun) 09:17:21|NO.13859

>>じったさん
堯(;゚□゚)ノ
こ、こういうことですか〜っ!
自前でポチポチやるより断然速い (O.O;)
あとは、指定色が黒の時の処理を考えればいいのか。すごいっす!

screen 0,640,480,0 ;コピー先画面 buffer 2,640,480,0 ;コピー元画面 picload "〜〜",1 r=〜 :g=〜 : b=〜 ;指定色 buffer 10,640,480,0 : cls 4 ;一時バッファ(黒で初期化) color r,g,b : gmode 4,,,256 gcopy 2,0,0,640,480 ;指定色以外を一時バッファにコピー(指定色部分は黒になる) gsel 2 : gmode 6,,,256 gcopy 10,0,0,640,480 ;先程の一時バッファからコピー元画面に減算コピー(指定色部分以外は黒になる) gsel 0 : gmode 2 gcopy 2,0,0,640,480 ;黒以外をコピー先画面にコピー buffer 10,1,1,0 ;一時バッファのクリア



inovia

リンク

2008/3/2(Sun) 09:58:12|NO.13860

>No.13858

減算という手がありましたか…
これなら大きいファイルでも一瞬で終わりますね。
コレ覚えとこっと。



a

リンク

2008/3/2(Sun) 20:37:37|NO.13866

指定色が黒の時の処理もやってみた

#include "gdi32.as" #const SRCINVERT $00660046 #const NOTSRCCOPY $00330008 width ,,400,150 title "コピー元" picload dir_exe+"\\sample\\demo\\jp6girl.bmp" hdc_0 = hdc img_w = ginfo_winx : img_h = ginfo_winy screen 3,,,,10,10 title "コピー先" color 0,80,0 : boxf gsel 0,1 : dialog "指定色をクリックで選んでください" onclick gosub *@f stop *@ if( ginfo_act != 0 ) { return } gsel 0 pget mousex, mousey //指定色 (クリック位置の色) r = ginfo_r g = ginfo_g b = ginfo_b gsel 3 : color 0,80,0 : boxf : pos 0,0 //見分けやすいように深緑を背景色とした if( r+g+b == 0 ) { //黒 buffer 1, img_w, img_h hdc_1 = hdc gmode 0 : gcopy 0, 0,0, img_w,img_h buffer 2, img_w, img_h hdc_2 = hdc gmode 2 : gcopy 1, 0,0, img_w,img_h BitBlt hdc_2, 0,0, img_w,img_h, hdc_1, 0,0, SRCINVERT BitBlt hdc_1, 0,0, img_w,img_h, hdc_2, 0,0, NOTSRCCOPY gsel 3 color 255,255,255 : gmode 4,,,256 gcopy 1, 0,0, img_w,img_h buffer 1, 1,1 buffer 2, 1,1 } else { //黒以外 buffer 1, img_w,img_h gmode 0 : gcopy 0, 0,0, img_w,img_h buffer 2, img_w,img_h cls 4 color r,g,b : gmode 4,,,256 : gcopy 1, 0,0, img_w,img_h gsel 1 gmode 6,,,256 : gcopy 2, 0,0, img_w,img_h gsel 3 gmode 2 : gcopy 1, 0,0, img_w,img_h buffer 1, 1,1 buffer 2, 1,1 } return



kotokoto

リンク

2008/3/2(Sun) 23:41:17|NO.13869

>>aさん
XORコピーで黒以外は全部黒になり、黒の部分は白になって、
最後はそれを反転させてコピー…(O_O;)
どこからそんなアイデアが出てくるんですか〜!



a

リンク

2008/3/3(Mon) 19:16:14|NO.13884

俺アホだ。
「あとは、指定色が黒の時の処理を考えればいいのか」と、
「gmodeでのコピー」ばかり頭にあって、変な事してしまってる。orz
直接xorでコピーしてしまえばいいだけでしたね。


#include "gdi32.as" #const SRCINVERT $00660046 width ,,400,150 title "コピー元" picload dir_exe+"\\sample\\demo\\jp6girl.bmp" hdc_0 = hdc img_w = ginfo_winx : img_h = ginfo_winy screen 3,,,,10,10 hdc_3 = hdc title "コピー先" color 0,80,0 : boxf gsel 0,1 : dialog "指定色をクリックで選んでください" onclick gosub *@f stop *@ if( ginfo_act != 0 ) { return } gsel 0 pget mousex, mousey //指定色 (クリック位置の色) r = ginfo_r g = ginfo_g b = ginfo_b gsel 3 : color 0,80,0 : boxf : pos 0,0 //見分けやすいように深緑を背景色とした x = 0 : y = 0 //コピー先の位置 buffer 1, img_w, img_h hdc_1 = hdc gmode 0 : gcopy 3, x,y, img_w,img_h color r,g,b : gmode 4,,,256 : gcopy 0, 0,0, img_w,img_h BitBlt hdc_3, x,y, img_w,img_h, hdc_1, 0,0, SRCINVERT BitBlt hdc_3, x,y, img_w,img_h, hdc_0, 0,0, SRCINVERT buffer 1, 1,1 gsel 3 : redraw 1 return



kotokoto

リンク

2008/3/3(Mon) 21:32:38|NO.13889

ぎゃーっ! 超シンプル!



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