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

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

【アレンジ用】自分でマクロを作りたい時の雛形プログラム

 

f:id:yu3xx:20201229114427p:plain


 

 

いろんな処理プログラムを書きたい時にいちいちゼロからつくるのはメンドイので、この雛形を使えば少し時短になってラクチン。っていうプログラムです。

 

//ListFilesRecursively_free

//JIBUNN DE IROIRO TSUKUTTE NE
//"??????" NO TOKORONI IROIRO KAITE NE




//Do something for selected folder
showMessage("Select Processing Folder");
openDir = getDirectory("Choose a Directory");
print("Processing :",openDir);
selectWindow("Log");
showMessage("Select Save Folder");
saveDir = getDirectory("Choose a Directory");
print("Save to :",saveDir);
selectWindow("Log");
list = getFileList(openDir);
wait(1000);


//Enter parameter
Dialog.create("Processing Setting");
items = newArray("JPEG", "PNG");
Dialog.addRadioButtonGroup("Output format", items, 1, 2, "JPEG");
Dialog.show;
output = Dialog.getRadioButton();

//Extension
if(output == "JPEG") ext = ".jpg";
if(output == "PNG") ext = ".png";

//JPEG,PNG quality setting(jpeg=90,gif=-1)
quality = 90;
run("Input/Output...", "jpeg=quality gif=-1 file=.csv save_column save_row");


//make parentDirectory
parentDir = saveDir+"postProc_"+getTimeStamp()+"/";
File.makeDirectory(parentDir);


//operation
startTime = whatTimeNow();
setBatchMode(true);
var totalFiles = 0;
var procCount = 0;

countFiles(openDir);
listFiles(openDir);


//fin
finishTime = whatTimeNow();
print("");

print("Start Time .... ",startTime);
print("FinishTime ... ",finishTime);
print("oshimai");
beep();



//-----------------------------------------------------------------------------
//Define countFiles

function countFiles(dir){
	list = getFileList(dir);
	for(i=0; i<list.length; i++){
		if(endsWith(list[i],"/")){
			countFiles(dir+list[i]);
		}else{
			totalFiles++;
		}
	}
}
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
//Define listFiles

function listFiles(dir){
	
	list = getFileList(dir);
	for(i=0; i<list.length; i++){
		if(endsWith(list[i],"/")){
			listFiles(dir+list[i]);
		}else{
			open(dir+list[i]);
			operation();
		}
	}
	
}
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
//Define operation

function operation(){
	
	procCount++;

	//Name setting
	name = getTitle();
	dotIndex = indexOf(name, ".");
	title = substring(name,0,dotIndex);
	underBar = lastIndexOf(title,"_");
	trueTitle = substring(title,0,underBar);
	number = substring(title,underBar+1);
	newname = title+ext;	
	rename(newname);

	//Progress.the second decimal place by 10000/100
	print(procCount,"/",totalFiles,"...Progress=",floor(procCount/totalFiles*10000)/100,"%");


	

	//--------- KOKO NI IROIRO IRETE NE ----------

	//????????????????????????????????????????????



	run("8-bit"); //TATOEBA KONNA KANJI DESU




	//????????????????????????????????????????????

	//Save to SubDirectory
	subDir = parentDir+trueTitle+"/";
	if(!File.exists(subDir)){
		File.makeDirectory(subDir);
	}
	
	saveAs(output, subDir+newname);
	print("Save to...",subDir+newname);

	close(newname);
}
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
//Define function getTimeStamp

function getTimeStamp(){
	getDateAndTime(year,month,dayOfWeek,dayOfMonth,hour,minute,second,msec);
	timeStamp = "string";
	strYear = ""+year;
	month = month+1;
	if(month < 10){
		strMonth = "0"+month;
	}else{
		strMonth = ""+month;
	}
	if(dayOfMonth < 10){
		strDayOfMonth = "0"+dayOfMonth;
	}else{
		strDayOfMonth = ""+dayOfMonth;
	}
	if(hour < 10){
		strHour = "0"+hour;
	}else{
		strHour = ""+hour;
	}
	if(minute < 10){
		strMinute = "0"+minute;
	}else{
		strMinute = ""+minute;
	}
	if(second < 10){
		strSecond = "0"+second;
	}else{
		strSecond = ""+second;
	}
	timeStamp = strYear+strMonth+strDayOfMonth+"_"+strHour+strMinute+strSecond;
	return timeStamp;
}
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
//Define function whatTimeNow

function whatTimeNow(){
	getDateAndTime(year,month,dayOfWeek,dayOfMonth,hour,minute,second,msec);
	stringTime = "string";
	strYear = ""+year;
	month = month+1;
	if(month < 10){
		strMonth = "0"+month;
	}else{
		strMonth = ""+month;
	}
	if(dayOfMonth < 10){
		strDayOfMonth = "0"+dayOfMonth;
	}else{
		strDayOfMonth = ""+dayOfMonth;
	}
	if(hour < 10){
		strHour = "0"+hour;
	}else{
		strHour = ""+hour;
	}
	if(minute < 10){
		strMinute = "0"+minute;
	}else{
		strMinute = ""+minute;
	}
	if(second < 10){
		strSecond = "0"+second;
	}else{
		strSecond = ""+second;
	}
	stringTime = strYear+"/"+strMonth+"/"+strDayOfMonth+"_"+strHour+":"+strMinute+":"+strSecond;
	return stringTime;
}

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

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

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

 

  

雛形プログラムがどんな内容かというと

再帰的(Recursively)に関数listFilesを呼び出すことで、選択した親フォルダ内の全ての子フォルダに含まれる全ファイルに対して処理。

 

② postProcフォルダを自動作成して、その中に処理後ファイルを保存。保存ファイル名は処理前ファイル名を引き継ぐ(拡張子「jpg or png」は選択可)。

 

③ 関数countFilesは選択したフォルダ内の全ファイル数のカウント。

 

④ 関数operationが処理のキモ。この部分を書き換えて自分のやりたい処理内容にアレンジ。

(デフォルトだと全ファイルをグレースケール8bitに変換して保存する内容)

 

f:id:yu3xx:20201229110957p:plain

「?????」で囲っている部分をお好みに書き換えるべし

 

 

 

 マクロの起動方法

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

 

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

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

 

③ ListFilesRecursively_free.txtをお好みの内容に書き換えて保存。保存マクロ名もお好みで(拡張子txtのマクロファイルは、マクロ名にアンダーバーを含めるのがルール。そうじゃないとリストに表示してくれないので注意)

 

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

 

⑤ 上部タブ[Plugins]→[自炊]→[お好みに改名したマクロ名]でマクロが実行されます。

 

 

imagej-jisui.hatenablog.com

 

 

 

 

 

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

  

imagej-jisui.hatenablog.com