以前公開した「データ確認のためちょこっとだけ画像表示させるマクロ」をちょこちょこカスタマイズしたものです。
//FileWatcher_Modoki.ijm
//Detect if there are any "Newly created files" in selected dir.
//"Deleted files" and "Modified files" are not the subject.
version = "2.2.0";
print("");
print("FileWatcher_Modoki.ijm");
print("ver",version);
print("");
var checkImgTime = 1800;
var width = 570; //seinen size comic
//var width = 550; //syounen size comic
var height = 1000;
//select dir
dir = getDirectory("Choose a Directory");
print("Watching :",dir);
print("");
//Database setting
var TEMP;
var DATABASE0;
var DATABASE1;
var DATABASE2;
var DATABASE3;
var DATABASE4;
var DATABASE5;
var DATABASE6;
var DATABASE7;
var DATABASE8;
var DATABASE9;
var DATABASEx;
//Main ope
resetDatabase();
list0 = getFileList(dir);
createDatabase(list0);
var year0,month0,week0,day0,hour0,min0,sec0,msec0;
getDateAndTime(year0,month0,week0,day0,hour0,min0,sec0,msec0);
var min=0;
while(min < 30){
//Show WaitingCount
getDateAndTime(year,month,week,day,hour,min,sec,msec);
msec = floor(msec/10 -msec0/10);
if(msec < 0){
msec = 100+msec;
sec = sec-1;
}
sec = sec - sec0;
if(sec < 0) {
sec = 60 + sec;
min = min -1;
}
min = min - min0;
if(min < 0) {
min = 60 + min;
hour = hour -1;
}
hour = hour - hour0;
if(hour <0){
hour = 24 + hour;
}
bytes = parseInt(IJ.currentMemory());
bytes = d2s(bytes/1000000,2);
print("\\Update:"+pad2(hour)+":"+pad2(min)+":"+pad2(sec)+":"+pad2(msec),"");
//Create list1
list1 = getFileList(dir);
//Check Missmatch list1 and Database
newImageGlance(list1);
//OverWrite database
resetDatabase();
createDatabase(list1);
wait(100);
}
showMessage("Time out");
//-----------------------------------------------------------------------------
function fileExistInArray(fileName,ARRAY){
output = 0;
for(i=0;i<ARRAY.length;i++){
number = ARRAY.length-1-i;
if(ARRAY[number] == fileName) {
output = 1;
break;
}
}
return output;
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
function pad2(n){
n = toString(n);
if(lengthOf(n) == 1) n="0"+n;
return n;
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
function resetDatabase(){
TEMP = newArray(1);
DATABASE0 = newArray(0);
DATABASE1 = newArray(0);
DATABASE2 = newArray(0);
DATABASE3 = newArray(0);
DATABASE4 = newArray(0);
DATABASE5 = newArray(0);
DATABASE6 = newArray(0);
DATABASE7 = newArray(0);
DATABASE8 = newArray(0);
DATABASE9 = newArray(0);
DATABASEx = newArray(0);
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
function createDatabase(list){
for(i=0;i<list.length;i++){
fName = list[i];
dot = lastIndexOf(fName,".");
assH = substring(fName,dot-1,dot);
TEMP[0] = fName;
if(assH == "0"){
DATABASE0 = Array.concat(DATABASE0,TEMP);
}else if(assH == "1"){
DATABASE1 = Array.concat(DATABASE1,TEMP);
}else if(assH == "2"){
DATABASE2 = Array.concat(DATABASE2,TEMP);
}else if(assH == "3"){
DATABASE3 = Array.concat(DATABASE3,TEMP);
}else if(assH == "4"){
DATABASE4 = Array.concat(DATABASE4,TEMP);
}else if(assH == "5"){
DATABASE5 = Array.concat(DATABASE5,TEMP);
}else if(assH == "6"){
DATABASE6 = Array.concat(DATABASE6,TEMP);
}else if(assH == "7"){
DATABASE7 = Array.concat(DATABASE7,TEMP);
}else if(assH == "8"){
DATABASE8 = Array.concat(DATABASE8,TEMP);
}else if(assH == "9"){
DATABASE9 = Array.concat(DATABASE9,TEMP);
}else{
DATABASEx = Array.concat(DATABASEx,TEMP);
}
}
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
function newImageGlance(list){
for(i=0;i<list.length;i++){
index = list.length-1-i;
fName = list[index];
dot = lastIndexOf(fName,".");
assH = substring(fName,dot-1,dot);
if(assH == "0"){
if(fileExistInArray(list[index],DATABASE0) == 0){
call("ij.gui.ImageWindow.setNextLocation",0, 0);
open(dir+list[index]);
setLocation(0,0,width,height);
close("\\Others");
wait(checkImgTime);
getDateAndTime(year0,month0,week0,day0,hour0,min0,sec0,msec0);
}
}else if(assH == "1"){
if(fileExistInArray(list[index],DATABASE1) == 0){
call("ij.gui.ImageWindow.setNextLocation",0, 0);
open(dir+list[index]);
setLocation(0,0,width,height);
close("\\Others");
wait(checkImgTime);
getDateAndTime(year0,month0,week0,day0,hour0,min0,sec0,msec0);
}
}else if(assH == "2"){
if(fileExistInArray(list[index],DATABASE2) == 0){
call("ij.gui.ImageWindow.setNextLocation",0, 0);
open(dir+list[index]);
setLocation(0,0,width,height);
close("\\Others");
wait(checkImgTime);
getDateAndTime(year0,month0,week0,day0,hour0,min0,sec0,msec0);
}
}else if(assH == "3"){
if(fileExistInArray(list[index],DATABASE3) == 0){
call("ij.gui.ImageWindow.setNextLocation",0, 0);
open(dir+list[index]);
setLocation(0,0,width,height);
close("\\Others");
wait(checkImgTime);
getDateAndTime(year0,month0,week0,day0,hour0,min0,sec0,msec0);
}
}else if(assH == "4"){
if(fileExistInArray(list[index],DATABASE4) == 0){
call("ij.gui.ImageWindow.setNextLocation",0, 0);
open(dir+list[index]);
setLocation(0,0,width,height);
close("\\Others");
wait(checkImgTime);
getDateAndTime(year0,month0,week0,day0,hour0,min0,sec0,msec0);
}
}else if(assH == "5"){
if(fileExistInArray(list[index],DATABASE5) == 0){
call("ij.gui.ImageWindow.setNextLocation",0, 0);
open(dir+list[index]);
setLocation(0,0,width,height);
close("\\Others");
wait(checkImgTime);
getDateAndTime(year0,month0,week0,day0,hour0,min0,sec0,msec0);
}
}else if(assH == "6"){
if(fileExistInArray(list[index],DATABASE6) == 0){
call("ij.gui.ImageWindow.setNextLocation",0, 0);
open(dir+list[index]);
setLocation(0,0,width,height);
close("\\Others");
wait(checkImgTime);
getDateAndTime(year0,month0,week0,day0,hour0,min0,sec0,msec0);
}
}else if(assH == "7"){
if(fileExistInArray(list[index],DATABASE7) == 0){
call("ij.gui.ImageWindow.setNextLocation",0, 0);
open(dir+list[index]);
setLocation(0,0,width,height);
close("\\Others");
wait(checkImgTime);
getDateAndTime(year0,month0,week0,day0,hour0,min0,sec0,msec0);
}
}else if(assH == "8"){
if(fileExistInArray(list[index],DATABASE8) == 0){
call("ij.gui.ImageWindow.setNextLocation",0, 0);
open(dir+list[index]);
setLocation(0,0,width,height);
close("\\Others");
wait(checkImgTime);
getDateAndTime(year0,month0,week0,day0,hour0,min0,sec0,msec0);
}
}else if(assH == "9"){
if(fileExistInArray(list[index],DATABASE9) == 0){
call("ij.gui.ImageWindow.setNextLocation",0, 0);
open(dir+list[index]);
setLocation(0,0,width,height);
close("\\Others");
wait(checkImgTime);
getDateAndTime(year0,month0,week0,day0,hour0,min0,sec0,msec0);
}
}else{
if(fileExistInArray(list[index],DATABASEx) == 0){
call("ij.gui.ImageWindow.setNextLocation",0, 0);
open(dir+list[index]);
setLocation(0,0,width,height);
close("\\Others");
wait(checkImgTime);
getDateAndTime(year0,month0,week0,day0,hour0,min0,sec0,msec0);
}
}
}
}
//-----------------------------------------------------------------------------
かなり魔改造っぽくなっていますが、ちゃんと動いてくれるのが嬉しいところです。
以前のバージョンはこちら。
変更点
① 画像表示時間(CheckImgTime)をちょびっと変更。お好みに調整してください。
② 監視ディレクトリ内のデータが多くなると検索時間が長くなる問題を、データベースを分割することで無理矢理高速化。
③ 新規ファイルを降順で番号の大きい方から検索・表示することで、表示までにかかる時間を無理矢理高速化。
④ 表示画像が大きく見やすくなるように調整した。PCのディスプレイサイズや本のサイズ等で変わるので、width, heightでお好みに調整してください。
従来式との違い
年末でヒマだったので、データベースを分割したことで処理時間にどれぐらい変化が出るのかを検証してみました。
検証の条件は、
・監視フォルダには2,270ファイル保存されている状態
・新規ファイルなしで、監視処理を100回ループ
・従来式とデータベース分割式のコードは以下の通り
従来式
checkImgTime = 1800;
//select dir
dir = getDirectory("Choose a Directory");
print("Watching :",dir);
print("");
initialTime = getTime();
//Main ope
list0 = getFileList(dir);
getDateAndTime(year0,month0,week0,day0,hour0,min0,sec0,msec0);
var min=0;
for(d=0;d<100;d++){
//Show Progress
//Show WaitingCount
getDateAndTime(year,month,week,day,hour,min,sec,msec);
msec = floor(msec/10 -msec0/10);
if(msec < 0){
msec = 100+msec;
sec = sec-1;
}
sec = sec - sec0;
if(sec < 0) {
sec = 60 + sec;
min = min -1;
}
min = min - min0;
if(min < 0) {
min = 60 + min;
hour = hour -1;
}
hour = hour - hour0;
if(hour <0){
hour = 24 + hour;
}
bytes = parseInt(IJ.currentMemory());
bytes = d2s(bytes/1000000,2);
print("\\Update:"+pad2(hour)+":"+pad2(min)+":"+pad2(sec)+":"+pad2(msec),"");
wait(100);
//Create list1
list1 = getFileList(dir);
//Check Missmatch list0 and list1
for(i=0;i<list1.length;i++){
index = list1.length-1-i;
if(fileExistInArray(list1[index],list0) == 0){
open(dir+list1[index]);
call("ij.gui.ImageWindow.setNextLocation",0, 0);
setLocation(0,0,570,1000);
close("\\Others");
wait(checkImgTime);
getDateAndTime(year0,month0,week0,day0,hour0,min0,sec0,msec0);
}
}
//OverWrite list0
list0 = Array.copy(list1);
}
completionTime=getTime();
print("old type");
elapsedTime = getElapsedTime(initialTime,completionTime);
print ("Elapsed Time ..." , elapsedTime);
//-----------------------------------------------------------------------------
function fileExistInArray(fileName,ARRAY){
output = 0;
for(i=0;i<ARRAY.length;i++){
if(ARRAY[i] == fileName) {
output = 1;
break;
}
}
return output;
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
function pad2(n){
n = toString(n);
if(lengthOf(n) == 1) n="0"+n;
return n;
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
function getElapsedTime(initialTime,completionTime){
eTime = completionTime - initialTime;
e_msec = eTime % 1000;
eTime=eTime / 1000;
e_sec = floor(eTime % 60);
e_min = floor(eTime / 60) % 60;
e_hour=floor(eTime / 3600);
strElapsedTime = ""+e_hour + " : "+e_min + " : " + e_sec + "." + zeroPad(e_msec,3);
return strElapsedTime;
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
//Define function zeroPadding
function zeroPad(int,digitZeroPad){
if(int < 0){
exit("ZeroPadding Error!! int<0");
}
stringInt = ""+int;
digitStringInt = lengthOf(stringInt);
digitSubtra = digitZeroPad-digitStringInt;
if(digitSubtra < 0){
exit("ZeroPadding Error!! digitSubtra<0");
}
if(digitZeroPad > 0){
for(i=0; i<digitSubtra; i++){
stringInt = "0"+stringInt;
}
}
return stringInt;
}
//-----------------------------------------------------------------------------
データベース分割式
var checkImgTime = 1800;
var width = 570;
var height = 1000;
//select dir
dir = getDirectory("Choose a Directory");
print("Watching :",dir);
print("");
initialTime = getTime();
//Database setting
var TEMP;
var DATABASE0;
var DATABASE1;
var DATABASE2;
var DATABASE3;
var DATABASE4;
var DATABASE5;
var DATABASE6;
var DATABASE7;
var DATABASE8;
var DATABASE9;
var DATABASEx;
//Main ope
resetDatabase();
list0 = getFileList(dir);
createDatabase(list0);
var year0,month0,week0,day0,hour0,min0,sec0,msec0;
getDateAndTime(year0,month0,week0,day0,hour0,min0,sec0,msec0);
var min=0;
for(d=0;d<100;d++){
//Show Progress
//Show WaitingCount
getDateAndTime(year,month,week,day,hour,min,sec,msec);
msec = floor(msec/10 -msec0/10);
if(msec < 0){
msec = 100+msec;
sec = sec-1;
}
sec = sec - sec0;
if(sec < 0) {
sec = 60 + sec;
min = min -1;
}
min = min - min0;
if(min < 0) {
min = 60 + min;
hour = hour -1;
}
hour = hour - hour0;
if(hour <0){
hour = 24 + hour;
}
bytes = parseInt(IJ.currentMemory());
bytes = d2s(bytes/1000000,2);
print("\\Update:"+pad2(hour)+":"+pad2(min)+":"+pad2(sec)+":"+pad2(msec),"");
wait(100);
//Create list1
list1 = getFileList(dir);
//Check Missmatch list1 and Database
newImageGlance(list1);
//OverWrite database
resetDatabase();
createDatabase(list1);
}
completionTime=getTime();
print("New type");
elapsedTime = getElapsedTime(initialTime,completionTime);
print ("Elapsed Time ..." , elapsedTime);
//-----------------------------------------------------------------------------
function fileExistInArray(fileName,ARRAY){
output = 0;
for(i=0;i<ARRAY.length;i++){
if(ARRAY[i] == fileName) {
output = 1;
break;
}
}
return output;
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
function pad2(n){
n = toString(n);
if(lengthOf(n) == 1) n="0"+n;
return n;
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
function resetDatabase(){
TEMP = newArray(1);
DATABASE0 = newArray(0);
DATABASE1 = newArray(0);
DATABASE2 = newArray(0);
DATABASE3 = newArray(0);
DATABASE4 = newArray(0);
DATABASE5 = newArray(0);
DATABASE6 = newArray(0);
DATABASE7 = newArray(0);
DATABASE8 = newArray(0);
DATABASE9 = newArray(0);
DATABASEx = newArray(0);
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
function createDatabase(list){
for(i=0;i<list.length;i++){
fName = list[i];
dot = lastIndexOf(fName,".");
assH = substring(fName,dot-1,dot);
TEMP[0] = fName;
if(assH == "0"){
DATABASE0 = Array.concat(DATABASE0,TEMP);
}else if(assH == "1"){
DATABASE1 = Array.concat(DATABASE1,TEMP);
}else if(assH == "2"){
DATABASE2 = Array.concat(DATABASE2,TEMP);
}else if(assH == "3"){
DATABASE3 = Array.concat(DATABASE3,TEMP);
}else if(assH == "4"){
DATABASE4 = Array.concat(DATABASE4,TEMP);
}else if(assH == "5"){
DATABASE5 = Array.concat(DATABASE5,TEMP);
}else if(assH == "6"){
DATABASE6 = Array.concat(DATABASE6,TEMP);
}else if(assH == "7"){
DATABASE7 = Array.concat(DATABASE7,TEMP);
}else if(assH == "8"){
DATABASE8 = Array.concat(DATABASE8,TEMP);
}else if(assH == "9"){
DATABASE9 = Array.concat(DATABASE9,TEMP);
}else{
DATABASEx = Array.concat(DATABASEx,TEMP);
}
}
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
function newImageGlance(list){
for(i=0;i<list.length;i++){
index = list1.length-1-i;
fName = list[index];
dot = lastIndexOf(fName,".");
assH = substring(fName,dot-1,dot);
if(assH == "0"){
if(fileExistInArray(list[index],DATABASE0) == 0){
call("ij.gui.ImageWindow.setNextLocation",0, 0);
open(dir+list[index]);
setLocation(0,0,width,height);
close("\\Others");
wait(checkImgTime);
getDateAndTime(year0,month0,week0,day0,hour0,min0,sec0,msec0);
}
}else if(assH == "1"){
if(fileExistInArray(list[index],DATABASE1) == 0){
call("ij.gui.ImageWindow.setNextLocation",0, 0);
open(dir+list[index]);
setLocation(0,0,width,height);
close("\\Others");
wait(checkImgTime);
getDateAndTime(year0,month0,week0,day0,hour0,min0,sec0,msec0);
}
}else if(assH == "2"){
if(fileExistInArray(list[index],DATABASE2) == 0){
call("ij.gui.ImageWindow.setNextLocation",0, 0);
open(dir+list[index]);
setLocation(0,0,width,height);
close("\\Others");
wait(checkImgTime);
getDateAndTime(year0,month0,week0,day0,hour0,min0,sec0,msec0);
}
}else if(assH == "3"){
if(fileExistInArray(list[index],DATABASE3) == 0){
call("ij.gui.ImageWindow.setNextLocation",0, 0);
open(dir+list[index]);
setLocation(0,0,width,height);
close("\\Others");
wait(checkImgTime);
getDateAndTime(year0,month0,week0,day0,hour0,min0,sec0,msec0);
}
}else if(assH == "4"){
if(fileExistInArray(list[index],DATABASE4) == 0){
call("ij.gui.ImageWindow.setNextLocation",0, 0);
open(dir+list[index]);
setLocation(0,0,width,height);
close("\\Others");
wait(checkImgTime);
getDateAndTime(year0,month0,week0,day0,hour0,min0,sec0,msec0);
}
}else if(assH == "5"){
if(fileExistInArray(list[index],DATABASE5) == 0){
call("ij.gui.ImageWindow.setNextLocation",0, 0);
open(dir+list[index]);
setLocation(0,0,width,height);
close("\\Others");
wait(checkImgTime);
getDateAndTime(year0,month0,week0,day0,hour0,min0,sec0,msec0);
}
}else if(assH == "6"){
if(fileExistInArray(list[index],DATABASE6) == 0){
call("ij.gui.ImageWindow.setNextLocation",0, 0);
open(dir+list[index]);
setLocation(0,0,width,height);
close("\\Others");
wait(checkImgTime);
getDateAndTime(year0,month0,week0,day0,hour0,min0,sec0,msec0);
}
}else if(assH == "7"){
if(fileExistInArray(list[index],DATABASE7) == 0){
call("ij.gui.ImageWindow.setNextLocation",0, 0);
open(dir+list[index]);
setLocation(0,0,width,height);
close("\\Others");
wait(checkImgTime);
getDateAndTime(year0,month0,week0,day0,hour0,min0,sec0,msec0);
}
}else if(assH == "8"){
if(fileExistInArray(list[index],DATABASE8) == 0){
call("ij.gui.ImageWindow.setNextLocation",0, 0);
open(dir+list[index]);
setLocation(0,0,width,height);
close("\\Others");
wait(checkImgTime);
getDateAndTime(year0,month0,week0,day0,hour0,min0,sec0,msec0);
}
}else if(assH == "9"){
if(fileExistInArray(list[index],DATABASE9) == 0){
call("ij.gui.ImageWindow.setNextLocation",0, 0);
open(dir+list[index]);
setLocation(0,0,width,height);
close("\\Others");
wait(checkImgTime);
getDateAndTime(year0,month0,week0,day0,hour0,min0,sec0,msec0);
}
}else{
if(fileExistInArray(list[index],DATABASEx) == 0){
call("ij.gui.ImageWindow.setNextLocation",0, 0);
open(dir+list[index]);
setLocation(0,0,width,height);
close("\\Others");
wait(checkImgTime);
getDateAndTime(year0,month0,week0,day0,hour0,min0,sec0,msec0);
}
}
}
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
function getElapsedTime(initialTime,completionTime){
eTime = completionTime - initialTime;
e_msec = eTime % 1000;
eTime=eTime / 1000;
e_sec = floor(eTime % 60);
e_min = floor(eTime / 60) % 60;
e_hour=floor(eTime / 3600);
strElapsedTime = ""+e_hour + " : "+e_min + " : " + e_sec + "." + zeroPad(e_msec,3);
return strElapsedTime;
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
//Define function zeroPadding
function zeroPad(int,digitZeroPad){
if(int < 0){
exit("ZeroPadding Error!! int<0");
}
stringInt = ""+int;
digitStringInt = lengthOf(stringInt);
digitSubtra = digitZeroPad-digitStringInt;
if(digitSubtra < 0){
exit("ZeroPadding Error!! digitSubtra<0");
}
if(digitZeroPad > 0){
for(i=0; i<digitSubtra; i++){
stringInt = "0"+stringInt;
}
}
return stringInt;
}
//-----------------------------------------------------------------------------
結果は、
・従来式... 78.24秒
・データべース分割式...24.26秒
でした。
データベース分割式の方が、3倍速いことがわかりました。
おしまい
ライセンスなんかは一切無いので、ぜひぜひ自由に使ってみてください!