// dsc.exe で連続してRAW画像を取得する uwscスクリプト // // Last updated: <2005/07/24 01:07:44 +0900> // by mieki256 // // STV680を使っているトイデジカメで利用する。 // // ・ 保存フォルダは、事前に指定しておく // = 1ファイルほど手動で取得しておけばOK。以後はそのフォルダに保存される。 // // ・ dsc.exe 側は、「grayscale」にチェックを入れておくこと。 // チェックを入れないと、求めるRAWが得られない。 // ----- 各環境に合わせて設定 ----- // 画像ウインドウが開くまでの秒数 wait_imgwindow = 3 // RAW保存にかかる時間 wait_saveraw = 1.5 // サムネイルの最初の位置 // 一番左上のサムネイルの真ん中あたりが、 // dsc.exe のウインドウの左上からどのあたりの位置にあるかを指定 // (Windows XP Lunaスタイル時なら、(80,80) ほど) tx0 = 80 ty0 = 80 // サムネイル領域 6 x n の縦横幅(dot) txc = 6 tyc = 4 txw = 630 tyw = 320 // ----- 設定ここまで ----- // 回数を入力 deadmsg_over = "指定数が多すぎます。" deadmsg_illegal = "不正な数が指定されました。処理を中断します。" deadmsg_cancel = "処理がキャンセルされました。" countoffsetstr = INPUT("何番目のファイルから処理するか指定してください。<#CR>(1 = 1番目。…各サムネイルの下に表示されてる数字に、騙されない(?)こと。)",1) IF countoffsetstr = EMPTY THEN dead(deadmsg_cancel) countoffset = VAL(countoffsetstr) IF countoffset = ERR_VALUE OR countoffset <= 0 then dead(deadmsg_illegal) IF countoffset > (txc * tyc) then dead(deadmsg_over + txc + "x" + tyc + "=" + (txc * tyc) + " 以下にしてください。") loopmaxstr = INPUT("RAW保存する画像数を指定してください。",0) IF loopmaxstr = EMPTY THEN dead(deadmsg_cancel) loopmax = VAL(loopmaxstr) IF loopmax = ERR_VALUE OR loopmax <= 0 then dead(deadmsg_illegal) IF loopmax > ((txc * tyc) - (countoffset-1)) then dead(deadmsg_over + ((txc * tyc) - (countoffset-1)) + " 以下にしてください。") msgdisp(countoffset + " 個目から " + loopmax + " ファイルをRAW保存します。") // dsc.exe の id 取得 id = GETID("LCDC Demonstrator") IF id = -1 THEN dead("dsc.exe のウインドウが見つかりません。") // 該当ウインドウをアクティブに IF STATUS(id,ST_ACTIVE) = FALSE THEN CTRLWIN(id,ACTIVATE) // dsc.exe の左上座標を取得 basex = STATUS(id,ST_X) basey = STATUS(id,ST_Y) // サムネイルの最初の位置を取得 basex = basex + tx0 basey = basey + ty0 x = basex y = basey MMV(x,y,50) // サムネイル1つ分の、マウスカーソル移動量を取得 dx = txw / (txc - 1) dy = tyw / (tyc - 1) cntx = 1 FOR c = 1 TO (loopmax + countoffset -1) IF STATUS(id,ST_ACTIVE) = FALSE THEN CTRLWIN(id,ACTIVATE) // 該当サムネイルへマウスカーソル移動 MMV(x,y,50) IFB c >= countoffset THEN // サムネイルをダブルクリック BTN(LEFT,CLICK,x,y,300) BTN(LEFT,DOWN,x,y,110) BTN(LEFT,UP,x,y,0) // 読み込みが終わって、画像ウインドウが出てくるまで数秒待つ sleep(wait_imgwindow) // 既に読み込まれてるとは思うけど、 // 念のため、1秒おきに、読み込めたかどうかチェック waitcount = 1 WHILE waitcount < 5 imgid = -1 imgid = GETID("Image ") IFB imgid = -1 THEN waitcount = waitcount + 1 sleep(1) ELSE waitcount = -1 BREAK ENDIF WEND IF waitcount >= 5 THEN dead("画像ウインドウが開けません。") // イメージウインドウの id 取得 imgid = -1 imgid = GETID("Image ") IF STATUS(imgid,ST_ACTIVE) = FALSE THEN CTRLWIN(imgid,ACTIVATE) // イメージウインドウの (w/3,h/3) あたりの座標を取得。 ix = STATUS(imgid,ST_X) iy = STATUS(imgid,ST_Y) iw = STATUS(imgid,ST_WIDTH) ih = STATUS(imgid,ST_HEIGHT) mx = ix + (iw / 3) my = ix + (ih / 3) // タイトル取得のためにマウスカーソル移動 MMV(mx,my,50) // イメージウインドウのタイトル取得 title = "" title = STATUS(imgid,ST_TITLE) // タイトルから数字を求め、それをファイル名にする num = get_num(title) fname = num + ".raw" msgdisp("save filename = " + fname) // 画像ウインドウ内で右クリック MMV(mx,my,50) BTN(RIGHT,CLICK,mx,my,100) // メニュー選択 KBD(VK_F,CLICK,200) // File KBD(VK_S,CLICK,200) // Save KBD(VK_R,CLICK,200) // Raw sleep(1) sid = GETID("名前を付けて保存") IF sid = -1 THEN dead("保存ダイアログが開けません") // ファイル名欄にファイル名を入力 // ファイル名欄にフォーカスがあることを期待 SENDSTR(0, fname) // 一度クリップボードへ転送 SCKEY(sid,VK_CTRL,V) // ペースト // Enter を押してRAWを保存 sleep(0.5) KBD(VK_RETURN,CLICK,50) sleep(wait_saveraw) // 画像ウインドウを閉じる CTRLWIN(imgid,CLOSE) ELSE sleep(0.5) ENDIF // 次のサムネイルへ // 「行」が終わったかどうか cntx = cntx + 1 ifb cntx > txc THEN cntx = 1 x = basex y = y + dy ELSE x = x + dx ENDIF NEXT msgdisp("終了しました") EXIT // サブルーチン // 時間待ち PROCEDURE mysleep() sleep(1) FEND // 不正終了 PROCEDURE dead(str) MSGBOX("エラー : " + str) EXITEXIT FEND // ふきだし表示 PROCEDURE msgdisp(str) x = G_SCREEN_W / 2 y = G_SCREEN_H / 2 fsize = 9 xw = length(str) * fsize x = x - (xw / 2) y = y - (fsize / 2) FUKIDASI(str, x, y, 0, fsize) sleep(1) FUKIDASI() FEND FUNCTION get_num(str) len = LENGTH(str) s = POS(" ",str) if s = 0 then dead("Not Found Space - 1") sstr = copy(str, s+1, len - s) len = LENGTH(sstr) s = POS(" ",sstr) if s = 0 then dead("Not Found Space - 2") numstr = copy(sstr,1,s-1) num = VAL(numstr) Result = num FEND