More ... | 編集履歴:差分記録開始以来の画像比較モジュールの変更箇所
+ * 画像比較モジュール + + {{{ + #module + //比較除外色の情報をすべてクリア + #deffunc imghclsdel + dim IMGHCOLOR,1:return + + // 比較する対象から除外する色を指定 + // imghclsadd R,G,B + #deffunc imghclsadd int p1, int p2, int p3 + if IMGHCOLOR=0{sdim IMGHCOLOR,64,0:IMGHCOLOR.(length(IMGHCOLOR)-1)=""+p1+","+p2+","+p3 + }else{:IMGHCOLOR.(length(IMGHCOLOR))=""+p1+","+p2+","+p3:}:return + + /* + imgh + p1 比較元ウィンドウID + + p2 比較先ウィンドウID + + p3 類似率を算出するアルゴリズム。 + 0で色の違いの度合いも含めて算出 + 1で色が少しでも違った場合、完全に違う色として算出 + 0だと類似率が高くなりがち、1だと低め。基本的に1推奨 + + p4 正確度。総ピクセル/p4で比較するピクセルの数を決定する為、 + 値を高くすればするほど処理は早くなるが正確性は失われる。 + 比較する画像・目的によっても変わるが、総px/1000.0程度の値を指定しても正確性は問題ない。 + + + 隠し機能として、比較するかしないかをRGB個別に指定可能。 + 下にあるAは上からR,G,Bに割り当てられていて、0で比較なし、1で比較あり。 + デフォだとRGB全て比較。 + */ + #defcfunc imgmc int 比較元,int 比較先,int モード,int sc2 + sc=sc2 + A.0=1 + A.1=1 + A.2=1 + 操作先ウィンドウID=ginfo(3) + gsel 比較元 + mref 比較元px,66 + 比較サイズx=ginfo_winx:比較サイズy=ginfo_winy + sc=limit(sc,1,(比較サイズx*比較サイズy)/10.0) + 総px=double(比較サイズx*比較サイズy)/sc + gsel 比較先 + mref 比較先px,66 + if 比較サイズx!ginfo_winx or 比較サイズy!ginfo_winy:Dialog "比較元のウィンドウサイズと\n比較先のウィンドウサイズが異なります。",1,"ウィンドウサイズが異なります":return -1 + dim 元,3,総px + dim 先,3,総px + dim 差,3 + 類似値=double(0.0) + repeat 総px + ct=cnt + repeat 3 + if A.cnt=1:{ + 元.cnt.ct=peek (比較元px,(ct*sc)+(2-cnt)) + 先.cnt.ct=peek (比較先px,(ct*sc)+(2-cnt)) + if (元.cnt.ct-先.cnt.ct)>=0 & モード=0:{ + 差.cnt+(元.cnt.ct-先.cnt.ct) + }else{ + 差.cnt+(先.cnt.ct-元.cnt.ct) + } + if (元.cnt.ct-先.cnt.ct)!0 & モード=1:{ + 差.cnt+255 + } + } + loop + loop + repeat 3 + if A.cnt=1:類似値+(100.0-(double(差.cnt)/double(総px*2.55))) + loop + 類似値/double(A.0+A.1+A.2) + gsel 操作先ウィンドウid + return 類似値 + #global + Screen 0,500,500 + dialog "",16,"画像" + if stat=1:picload refstr,1:else:Color 255,0,0:boxf 10,10,490,490 + + Screen 1,ginfo_winx,ginfo_winy + dialog "",16,"画像" + if stat=1:picload refstr,1:else:Color 150,0,0:boxf 5,5,495,495 + 正確性=(ginfo_winx*ginfo_winy)/10.0 + title ""+imgmc(0,1,0,正確性) + }}} |