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


HSPTV!掲示板


未解決 解決 停止 削除要請

2017
0815
たきpgetやバッファの読み込みについて8未解決


たき

リンク

2017/8/15(Tue) 03:31:09|NO.80958

画像を1ドットずと比較して同じ画像か判別しようとしたのですが
バッファに画像読み込んだりbgcerで非表示にしてpgetを使うとできなくて
screen 0で描いてからその位置をしていしないと使えなくて困ってます
擬似的に見えない位置でスクリーンに見えないところに描いてもだめみたいで
ウィンドウに描いてないとpgetできない見たいです
探していたらmref.peekでバッファに読み書きできるとあるのですが
ドットでしかよくわからなくてバイトでの考え方がよくわかりません
できるだけわかりやすく教えてくださると嬉しいです



この記事に返信する


ばってん

リンク

2017/8/15(Tue) 08:18:51|NO.80960

VRAMなどの難しいことは判りませんが、私は普通にpgetで取れましたよ。


screen 0 ;スクリーン0初期化 color:boxf:pget 0,0 ;黒で塗りつぶして左上をpget r0=ginfo_r:g0=ginfo_g:b0=ginfo_b ;色を保存(結果用) buffer 1 ;バッファ1初期化 pget 0,0 ;そのまま左上をpget r1=ginfo_r:g1=ginfo_g:b1=ginfo_b ;色を保存(結果用) buffer 2 ;バッファ2初期化 color 255:boxf:pget 0,0 ;赤で塗りつぶして左上をpget r2=ginfo_r:g2=ginfo_g:b2=ginfo_b ;色を保存(結果用) bgscr 3,,,2 ;枠のないウィンドウを初期化 color 128,128,128:boxf :pget 0,0 ;灰色で塗りつぶして左上をpget r3=ginfo_r:g3=ginfo_g:b3=ginfo_b ;色を保存(結果用) gsel 0:color 255,255,255 mes "結果(左上(0,0)の色)" mes "screen 0:("+r0+","+g0+","+b0+")" mes "buffer 1:("+r1+","+g1+","+b1+")" mes "buffer 2:("+r2+","+g2+","+b2+")" mes "bgscr 3:("+r3+","+g3+","+b3+")"



MillkeySoftw

リンク

2017/8/15(Tue) 14:02:21|NO.80961

gsel で操作先を指定しないと、pget / pset は正しく行えません。

仮に、screen 4 というウィンドウID 4 があるとして現在の操作先がウィンドウID 0 である場合、pset / pget はウィンドウ 0 の画像データを取得します。
pset / pget を行う前に必ず操作したいウィンドウID を gsel で指定してください。

また、mref の VRAM データも同じで mref のデータも現在の操作先のウィンドウID でデータの宛先を取得します。
下記のように取得してください。

gsel 0 mref screen_0_Vram,66 gsel 1 mref screen_1_Vram,66 gsel 2 mref screen_2_Vram,66

また、VRAM データそのものは、下記URL を参照してください。
https://wiki.hsp.moe/小ワザ%EF%BC%8FVRAMを直接操作してみる.html



KA

リンク

2017/8/15(Tue) 17:17:01|NO.80962

>>画像を1ドットずと比較して同じ画像か判別

余計なお世話かもしれませんが、元にする画像ファイルがJPEG等の
非可逆圧縮だったりすると、全く同じファイルでない限り一致する
ことはまずありません。

可逆圧縮のPNG等とBMPなら比較する意味も有りますが、この場合は
αチャンネルを無視するかどうかでも変わってきます。



ゆー

リンク

2017/8/15(Tue) 20:07:57|NO.80966

これでどうでしょうか?

buffer 1 color 254,254,254 boxf pget 0,0 赤=ginfo_r 緑=ginfo_g 青=ginfo_b gsel 0 mes "赤="+赤+"\n緑="+緑+"\n青="+青



沢渡

リンク

2017/8/15(Tue) 21:21:25|NO.80969

とりあえず、pgetを使って画像の内容を比較するコードです。
バッファ内のみで完結し、メインの画面には画像は表示しません。

//画面0と画面1の内容が完全に一致するか比較するプログラム(pgetを使用) file1="test1.png" file2="test2.png" //この二つの画像を比較する。 //画像読み込み buffer 1,1,1,0 : gsel 1 picload file1 buffer 2,1,1,0 : gsel 2 picload file2 //画像の大きさを調べる gsel 1 w1=ginfo_winx : h1=ginfo_winy gsel 2 w2=ginfo_winx : h2=ginfo_winy if (w1!=w2)|(h1!=h2) : dialog "違う画像です" : end //2つの画像の横サイズか縦サイズが違う場合は違う画像 //画像の内容を比較 flag=0 repeat h1 cnt0=cnt repeat w1 gsel 1 pget cnt,cnt0 //バッファ1からドットの内容を取得 r1=ginfo_r : g1=ginfo_g : b1=ginfo_b gsel 2 pget cnt,cnt0 //バッファ2からドットの内容を取得 r2=ginfo_r : g2=ginfo_g : b2=ginfo_b if (r1!=r2)|(g1!=g2)|(b1!=b2) { //ドットの色が違う場合は、違う画像 dialog "違う画像です" flag=1 break } loop if flag=1 : break loop if flag=0 : dialog "同じ画像です"

これだと画像のサイズによってはかなり時間がかかるので、こちらはVRAMを直接読むバージョンです。
理解はしづらいかもしれませんが、参考までに。

//画面0と画面1の内容が完全に一致するか比較するプログラム(VRAMを使用) #define ctype nnot(%1) ((%1)^0xFFFFFFFF) //%1のnotを返す file1="test1.png" file2="test2.png" //この二つの画像を比較する。 //画像読み込み buffer 1,1,1,0 : gsel 1 picload file1 mref vram1,66 buffer 2,1,1,0 : gsel 2 picload file2 mref vram2,66 //画像の大きさを調べる gsel 1 w1=ginfo_winx : h1=ginfo_winy gsel 2 w2=ginfo_winx : h2=ginfo_winy if (w1!=w2)|(h1!=h2) : dialog "違う画像です" : end //2つの画像の横サイズか縦サイズが違う場合は違う画像 vram_wid=((w1*3)+3)&nnot(3) //VRAMの横の大きさ //画像の内容を比較 flag=0 repeat h1 cnt0=cnt vram_wid2=vram_wid*cnt0 repeat w1 b1=peek(vram1,vram_wid2+cnt*3) //バッファ1からドットの内容を取得 g1=peek(vram1,vram_wid2+cnt*3+1) r1=peek(vram1,vram_wid2+cnt*3+2) b2=peek(vram2,vram_wid2+cnt*3) //バッファ2からドットの内容を取得 g2=peek(vram2,vram_wid2+cnt*3+1) r2=peek(vram2,vram_wid2+cnt*3+2) if (r1!=r2)|(g1!=g2)|(b1!=b2) { //ドットの色が違う場合は、違う画像 dialog "違う画像です" flag=1 break } loop if flag=1 : break loop if flag=0 : dialog "同じ画像です"



たき

リンク

2017/8/16(Wed) 00:50:53|NO.80971

皆さんありがとうございます!
お恥ずかしい話ですがpsetで張り付ける時に間違えてました
色が取れない取れないと思いきやcolorに指定してなくて
今やったらちゃんとできました
恥ずかしついでにvram#define ctype nnot(%1) ((%1)^0xFFFFFFFF) //%1のnotを返す
とかの意味がわからないです
最近ちょとずつgselでしていしないとだめとかginfoとか情報取得やらわかりかけてきましたが
わからない所もあるので、初心者はなにがわからないかわからないて勉強みたいな所もあるので
出来たらわかりにくい所を説明してくださると助かります
皆さんが教えてくださったのもあり比較等もできました
ありがとうございます



たき

リンク

2017/8/19(Sat) 03:20:09|NO.81008

mrefで画像は高速化できるとして
テキストを大量に保存しようとすると
同じくらい、時間かかるのですが
こちらもバッファとかで高速化できないでしょうか?
何列にも分けていたのを一列にしてstrmidで抜き出すだけにしましたが
結局凄い時間がかかります
バッファの書き込みと保存では別物ですか?



MillkeySoftw

リンク

2017/8/19(Sat) 14:04:10|NO.81010

テキストがどんな物なのかわからないと何とも言えないのですが、基本的に strmid は遅いです。

まず、複数行テキストを一行にまとめる必要があるのか?
複数行も一行もどちらも同じメモリの塊です。あるなしと考えると改行コードのあるなしかな。

スクリプトが提示されてないので詳しく答えられませんが、意味のない処理の排除・命令の置き換えなどで高速化ができる場合もあるのでなるべくなら特定部分のスクリプトの提示をお願いします。



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