その漫画自炊オタクはImageJマクロに恋をする

プログラミングを用いた、自炊漫画の画像処理

持っている本の数を表示させるためのMacro

 

f:id:yu3xx:20200624020255j:plain

 

特定のディレクトリ内のすべてのサブディレクトリとファイルを調べて、持っている本の一覧と数を表示させるためのマクロです。

 

 

 2020.04.01. 追記 エクセル等に持ち出すための表も作成するように修正しました。

 2021.06.06. 追記 ファイル更新日をテーブルに表示するよう変更しました。(ver.3.0.1)

//TotalBooks Counting
//check All Directories and Files in a user-specified directory
//for PDF, JPEG, PNG, zip
//jpg,png -> 1 count / 1 directory

version = "3.0.2";

print("");
print("TotalBooks Counting");
print("ver",version);

openDir = getDirectory("chose open folder");

count = 0;
Table.create("TotalBooks");

listFiles(openDir);

function listFiles(dir){
	list = getFileList(dir);
	for(i=0; i<list.length; i++){

		//detect a directory -> do function listFiles recursively 
		if(endsWith(list[i],"/")){
			listFiles(dir+list[i]);

		//PDF, JPG, PNG, ZIP-> Record
		}else if(endsWith(list[i],".pdf")||endsWith(list[i],".PDF")||endsWith(list[i],".jpg")||endsWith(list[i],".JPG")||endsWith(list[i],".jpeg")||endsWith(list[i],".JPEG")||endsWith(list[i],".png")||endsWith(list[i],".PNG")||endsWith(list[i],".zip")||endsWith(list[i],".ZIP")){
			count++;
			
			//Update date
			unixtime = File.lastModified(dir+list[i]);
			unixtime = parseInt(unixtime);
			tokyotime = ConvertUnixTimeToTokyoTime(unixtime);

			//Output table
			Table.set("No.",count-1,count);
			Table.set("Directory",count-1,dir);
			Table.set("Name",count-1,list[i]);
			Table.set("Last Updated",count-1,tokyotime);

			
			//Print Log
			print(count,":",dir+list[i]);
			
			//JPEG,PNG -> skip to next dir (1 count / 1 dir)
			if(endsWith(list[i],".jpg")||endsWith(list[i],".JPG")||endsWith(list[i],".jpeg")||endsWith(list[i],".JPEG")||endsWith(list[i],".png")||endsWith(list[i],".PNG")){
				i=list.length; //break
			}

		}
	}
}

print("");
print(openDir,"....");
print("In total ",count," books");
Table.update;


//-----------------------------------------------------------------------------
//Define function ConvertUnixTimeToTokyoTime

function ConvertUnixTimeToTokyoTime(unixtime) {
   
	year = 0;
	leap = 0;
	GMT_TOKYO = 9*60*60;
	SECONDS_IN_A_DAY = 24*60*60;
	UNIX_EPOCH_DAY = 1969*365 + floor(1969/4) - floor(1969/100) + floor(1969/400) + 306; //  days from 0000/03/01 to 1970/01/01
	YEAR_ONE = 365;
	YEAR_FOUR = YEAR_ONE * 4 + 1; 
	YEAR_100 = YEAR_FOUR * 25 - 1;
	YEAR_400 = YEAR_100*4 + 1;

	monthday = newArray (0,31,61,92,122,153,184,214,245,275,306,337);

	unixtime = unixtime / 1000; //msec to sec

	unixtime = unixtime + GMT_TOKYO;
	second = floor(unixtime % 60);
	minute = floor(unixtime / 60) % 60;
	hour = floor(unixtime / 3600) % 24;

	unixday = floor(unixtime / SECONDS_IN_A_DAY);
	unixday = unixday + UNIX_EPOCH_DAY;

	year = year + 400 * floor(unixday / YEAR_400);
	unixday = unixday % YEAR_400 ;

	n = floor(unixday / YEAR_100);
	year = year + n * 100;
	unixday = unixday % YEAR_100 ;

	if (n == 4){
		leap = 1;
	}else{
		year = year + 4 * floor(unixday / YEAR_FOUR);
		unixday = unixday % YEAR_FOUR ;
        
		n = floor(unixday / YEAR_ONE);
		year = year + n;
 		unixday = unixday % YEAR_ONE ;

		if (n == 4) {
			leap = 1;
		}
	}
	if (leap != 0) {
		month = 2;
		day = 29;
	}else{
		month = floor(((unixday + 0.4) * 5) / 153);
		day = unixday - monthday[month] + 1;
		month = month + 3;
		if (month > 12) {
			year++;
			month = month - 12;
		}
	}
	tokyoTime = "" + year + "/" + zeroPad(month,2) + "/" + zeroPad(day,2) + "  " + zeroPad(hour,2) + ":" +zeroPad(minute,2) + ":" + zeroPad(second,2);
	return tokyoTime;
}

//-----------------------------------------------------------------------------


//-----------------------------------------------------------------------------
//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;
}	

//-----------------------------------------------------------------------------


 

ポイント

①PDFとZIPは1ファイル=1冊でカウント。

JPEGPNG1フォルダ=1冊でカウント。

 

 

実行結果

 

f:id:yu3xx:20200224075044p:plain

こんな感じで一覧と数が表示されます。私の10年物ショボPCでも数十秒で終わります。

 

JPEGでカウントしているのは、ファイルの数ではなく、フォルダの数です。たとえば「ドラゴンボール」と名付けた1フォルダの中に、全42巻のJPEGデータがどちゃっと全部入っている場合には、「ドラゴンボール」は1冊でカウントされてしまいます。あくまで目安としてお使いください。

 

 

マクロの起動方法

①ImageJ上部タブの[Plugins]→[New]→[Macro]で起動したエディタに、記事の一番上のコードをコピペしてtxtファイル(Count_TotalBooks.txt)を作成・保存する。

 

②保存したファイルをImageJフォルダ内の[plugins]フォルダにしまう。

 

このとき、[plugins]フォルダの中に新たに適当な名前のフォルダを作って、その中にしまってもOKです。ここでは仮に「自炊」というフォルダにtxtファイルを突っ込んだとします。

 

③一度ImageJを再起動すると、マクロがインストールされ、起動準備OK。

 

④上部タブ[Plugins]→[自炊]→[Count TotalBooks]でマクロが実行されます。

 

 

imagej-jisui.hatenablog.com

 

 

 

 

ライセンスなんかは一切無いので、ぜひぜひ自由に使ってみてください!

 

imagej-jisui.hatenablog.com