[ 掲示板に戻る ]

記事No.534に関するスレッドです

CHKIMG関数で、配列の要素に入っている画像を参照元にできませんか? / くまさん
参照先の画像(ウインドウ内の画像)の有無を、
500個位ある参照元の画像ファイル(画像名)と比較して検出するために、
ループで CHKIMG(GETDIR_FILES[i], サーチ範囲) としているのですが、
ひとつの参照先の画像の有無の結果が判るまでに1分ほど時間がかかってしまいます。

毎回HDDからGETDIR_FILES[i]に対応する参照元画像を読み込んでは比較している
ためにこれほど時間がかかってしまうのだと思うのですが、

この比較時間を大幅に短縮させる方法は無いでしょうか?

例えば、 画像同士の比較のループに入る前に
参照元の.bmpファイルを全て配列の中に取り込んでしまって、
(最初にメモリ上に乗せてしまって?)
その配列の要素(参照元の.bmpファイルのバイナリデータ?)と参照先の画像とを比較
することで画像の有無を検出できないものでしょうか?

もし、なにか大幅に検出速度を上げる方法をご存じの方がいらっしゃいましたら、
教えて下さい。

/////////////////////////////////////////////////////////////////////
戻値 = CHKIMG( [画像名, 透過色/色無視, x1, y1, x2, y2, 番号, 色幅] )

引数
画像名: BMP画像ファイルまでのフルパス (画像名を省略した場合はクリップボードから)
透過色/色無視:
0: 指定なし (デフォルト)
1: 左上、2:右上、3:左下、4:右下 の1ピクセルの色を透過色として処理
-1: 色を無視して形でチェックする
x1, y1, x2, y2: サーチ範囲
番号: 複数ある場合に順番を指定 (左上から)
-1: -1が指定された場合はヒットした数を戻値として返し、
座標情報は ALL_IMG_X[], ALL_IMG_Y[] に格納
(G_IMG_X、 G_IMG_Y には最後にヒットした位置が入る)
色幅: チェックに色幅を持たせる
(色無視指定時もしくは 16bitカラー以下の場合は無効)
IMG_MSK_BGR1 // 各色(BGR)に対し 2/256の色幅を許す
IMG_MSK_BGR2 // 各色(BGR)に対し 4/256の色幅を許す
IMG_MSK_BGR3 // 各色(BGR)に対し 8/256の色幅を許す
IMG_MSK_BGR4 // 各色(BGR)に対し 16/256の色幅を許す
IMG_MSK_B1, 2, 3, 4 // 青に対し 2/256, 4/256, 8/256, 16/256の色幅を許す
IMG_MSK_G1, 2, 3, 4 // 緑に対し 2/256, 4/256, 8/256, 16/256の色幅を許す
IMG_MSK_R1, 2, 3, 4 // 赤に対し 2/256, 4/256, 8/256, 16/256の色幅を許す
※ 演算可 例:IMG_MSK_B1 or IMG_MSK_R3
(青に対し 2/256の色幅を許す + 赤に対し 8/256の色幅を許す)

戻値
有ればTRUE、無ければFALSE
TRUE の場合は見つかった座標を特殊変数 G_IMG_X、 G_IMG_Y に格納
引数の番号にて -1指定時はヒットした数を返し、
座標情報は配列変数 ALL_IMG_X[], ALL_IMG_Y[] に格納

No.533 2014/12/04(Thu) 23:18:04

Re: CHKIMG関数で、配列の要素に入っている画像を参照元にできませんか? / koi
実際そこまで大量のファイルでやったことはありませんし
読み込む画像の大きさなどにもよって話が変わってくるので
あくまで案としての話になります

1.標準の関数ではどうにもならないと思うので
  APIをコールして自前で一括読み込みしておき必要に応じて対応した画像を
  クリップボードに転送するようなコードを作成する

以下あたりが参考になるかと思います
http://tokovalue.jp/SetClipboardData_U.htm

2.安直な方法として
  HDDにおいている画像をより高速アクセス可能なデバイス
  (RAMDISKやSSD等)上から読むように変更する

等が思いつきます

No.534 2014/12/05(Fri) 00:47:44

Re: CHKIMG関数で、配列の要素に入っている画像を参照元にできませんか? / くまさん
koiさん、有用な情報をいただき有難うございました。
これをヒントにして解決できましたら、
報告させていただきます。

No.536 2014/12/05(Fri) 13:05:40

Re: CHKIMG関数で、配列の要素に入っている画像を参照元にできませんか? / umiumi
CHKIMG, PEEKCOLOR関数が遅い(Vista/7/8)  #n32
http://www.uwsc.info/faq.html#n32

BMPはUWSC内部でキャッシュしているので毎回読みには行きません。

No.538 2014/12/06(Sat) 00:48:21

Re: CHKIMG関数で、配列の要素に入っている画像を参照元にできませんか? / くまさん
umiumiさん、 ご回答ありがとうございました。

MORG_BACKを追加してみましたところ、
既に持っている画像に対して、「画像をまだもっていない」となってしまいます。
(同じ大きさ、同じ間隔で 横に6個並んでいる画像の内、1〜5個の画像が無いことになっている)

バックグランドでCHKIMG()をするときは、探索範囲の座標位置が変わってしまうなど
なのでしょうか?

///////////////////////////////////////////////////////////////////////////////

FOR i = 0 TO ( LENGTH(GETDIR_FILES) - 1 )

//MOUSEORG(WM_ID)
MOUSEORG(WM_ID, MORG_BACK)

IF CHKIMG(searchDir + "\" + GETDIR_FILES[i], 0, 706, 630, 740, 663) THEN d[1] = true
IF CHKIMG(searchDir + "\" + GETDIR_FILES[i], 0, 740, 630, 774, 663) THEN d[2] = true
IF CHKIMG(searchDir + "\" + GETDIR_FILES[i], 0, 774, 630, 807, 663) THEN d[3] = true
IF CHKIMG(searchDir + "\" + GETDIR_FILES[i], 0, 807, 630, 841, 663) THEN d[4] = true
IF CHKIMG(searchDir + "\" + GETDIR_FILES[i], 0, 841, 630, 875, 663) THEN d[5] = true
IF CHKIMG(searchDir + "\" + GETDIR_FILES[i], 0, 875, 630, 909, 663) THEN d[6] = true

NEXT // CHKIMGのループ

No.544 2014/12/06(Sat) 14:15:11

Re: CHKIMG関数で、配列の要素に入っている画像を参照元にできませんか? / umiumi
基準指定を抜かしている
MOUSEORG(WM_ID, 0, MORG_BACK)

またアプリが最大化した状態の場合にはバックグランド指定時に 8ドットずれるバグを確認しています。修正予定

No.551 2014/12/07(Sun) 00:08:24

Re: CHKIMG関数で、配列の要素に入っている画像を参照元にできませんか? / くまさん
あっほんとだ
ご指摘ありがとうございました。

さっそく試しまして、効果がありました。
どうもありがとうございました。

No.552 2014/12/07(Sun) 21:53:53