とりあえず、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 "同じ画像です"