開けないファイルを消す

 Photoshop CS + JavaScriptで自動的に処理を行わせる場合に、何らかの障害でファイルが開けない事があります。例えばEPS形式なのにJPEG形式だったり(拡張子が間違っている)、ファイル自体が途中までしかない(壊れている、途中までしか転送できなかった)場合などはファイルが開けずにエラーとなってしまいます。
 Photoshop CSのJavaScriptにはエラーを処理するためのtry, catch, throw命令が用意されています。主に使うのはtryとcatchです。tryでエラーを引き起こす可能性のある命令部分を囲んでおきます。エラーが発生した場合にはcatch内の処理が行われます。catchでは、どのようなエラーが発生したかを知る事ができるので、それに応じて処理を分けることができます。
 ここではエラーが発生した元のファイルはファイル転送ミスとして消してしまうスクリプトを用意しました。消してしまうのはエラーのあるファイルを何度も読み込んでしまい次の処理すべきファイルにとりかかれないためです。

 実際のスクリプトは以下のようになります。

●開けないファイルを消す
originalFolder = "/data/";

folderRef = new Folder(originalFolder);
fileList = folderRef.getFiles("*.jpg");
for (i=0; i<fileList.length; i++)
{
fileRef = new File(fileList[i].fullName);
flag = true;

try{
open(fileRef);
}
catch(e){
flag = false;
fileRef.remove();
}

if (flag) activeDocument.close(SaveOptions.DONOTSAVECHANGES);

}

 一番最初の行が元のファイルがあるフォルダパスです。サンプルでは/data/となっているのでルートディレクトリにあるdataフォルダ内という事を示しています。MacOS Xではフォルダ名などに日本語が入っていると正しく動作しません。英数字にしましょう。
 問題のないファイルのみ開き、そうでない場合はcatch内でremove()としてファイルを消してしまいます。MacOS XのFinderやExplorerの操作と違って取り消しが出来ませんので注意が必要です。

 上記のサンプルだとファイルを開くか消すかしかないので実用的ではありません。ちょっと実用的?なサンプルが以下のものです。これは、左上を基準にしてトリミングするものです。イメージメニューのトリミング...と同じです。トリミングしたらjpgフォルダにデータを保存します。保存先は

JPEGfolder = "/jpg/";

の/jpg/を変更します。これはルートディレクトリにあるjpgフォルダを示しています。やはりMacOS Xでは日本語を使うと正しく動作しないので気をつけて下さい。


●読めるファイルはトリミング、そうでない場合は元ファイルを削除
originalFolder = "/data/";
JPEGfolder = "/jpg/";

folderRef = new Folder(originalFolder);
fileList = folderRef.getFiles("*.jpg");
for (i=0; i<fileList.length; i++)
{
// JPEG file open
fileRef = new File(fileList[i].fullName);
fName = fileList[i].name;
flag = true;

try{
open(fileRef);
}
catch(e){
flag = false;
// File delete
fileRef.remove();
}

if (flag)
{
// File open OK -> trim image
activeDocument.trim(TrimType.TOPLEFT, true, true, true, false);

// JPEG file save
saveJPEG(JPEGfolder+fName);

// Document close
activeDocument.close(SaveOptions.DONOTSAVECHANGES);
}

}

// JPEG save ================================================
function saveJPEG(filename)
{
// JPEG file save
var fileObj = new File(filename);
var jpegOpt = new JPEGSaveOptions();
jpegOpt.embedColorProfile = true;
jpegOpt.quality = 3;
jpegOpt.formatOptions = FormatOptions.PROGRESSIVE;
jpegOpt.scans = 3;
jpegOpt.matte = MatteType.NONE;
activeDocument.saveAs(fileObj, jpegOpt, true, Extension.LOWERCASE);
}

 trim(〜)の設定値ですが、以下のようになっています。

一番目の引数:方法
        TrimType.BOTTOMRIGHT  右下のピクセルカラー
        TrimType.TOPLEFT     左上のピクセルカラー
        TrimType.TRANSPARENT  透明ピクセル
二番目の引数:上 (トリミングする部分。true=する、false=しない)
三番目の引数:左 (トリミングする部分。true=する、false=しない)
四番目の引数:下 (トリミングする部分。true=する、false=しない)
五番目の引数:右 (トリミングする部分。true=する、false=しない)


 実際には、これでエラー処理は問題なく出来そうですが、思わぬトラブルでダイアログがでてしまうこともあります。次回はMacOS XでUNIXのcronを使って定期的にPhotoshop CSでスクリプト処理を行わせている場合、エラーダイアログが表示された際の回避方法について説明します。




[サンプルをダウンロード]