大量の画像を切り抜く(マスク/アルファチャンネル)

今回は大量に画像を切り抜くスクリプトです。画像を特定の形に切り抜きたい場合があります。画像の枚数が数十枚なら手作業で良いでしょうし、その方が早いでしょう。しかし100枚以上になると、さすがに手作業では疲れますしミスも発生しやすくなります。そんな時は以下のようなスクリプトを使えば任意の形状に切り抜く事ができます。
まず、切り抜く前に準備が必要です。切り抜くためにマスクをアルファチャンネルに作成しておきます。つまり切り抜く形状をアルファチャンネルに設定しておくわけです。ちなみに、ここではRGB画像を想定しているので、それ以外の画像モードでは動作しません(スクリプトの変更が必要です)。
次にエディタで切り抜かれる画像のファいる名一覧を作成します。例えば以下のように画像ファイル名だけを並べます。

001.jpg
002.jpg
ABC.jpg
DEF.gif
zzz.jpg

これらの画像ファイルがあるフォルダは

imageFolder = "/dgcr/image/"; // 切り抜かれる画像があるフォルダ

で指定します。この場合は、dgcrフォルダ内のimageフォルダ内に001.jpg、002.jpgがあるということです。
これで準備が終了しましたので、あとは実行するだけです。ファイルが存在しない場合の処理は行っていないのでファイルがないとスキップされてしまい処理されません。

TABCODE = String.fromCharCode(9); // タブコード
motoFile = new File("/dgcr/moto.psd"); // 元ファイルがある画像のパス
dataFile = new File("/dgcr/data.txt"); // 画像ファイル名一覧のファイル名
saveFolder = "/dgcr/result/"; // 切り抜かれた画像の保存先フォルダ
imageFolder = "/dgcr/image/"; // 切り抜かれる画像があるフォルダ

if (dataFile.open("r") == true)
{
while(!dataFile.eof)
{
tmp = dataFile.readln();
Text = tmp.split(TABCODE);
// ダブルクオーテーションの処理
for (i=0; i<Text.length; i++)
{
if (Text[i].charAt(0) == '"')
{
Text[i] = Text[i].substring(1,Text[i].length-1);
}
}
fileObj = new File(imageFolder+Text[0]);
if (fileObj.open("r") == true)
{
// 画像の配置
open(fileObj);
activeDocument.selection.selectAll(); // 全てを選択
activeDocument.activeLayer.copy(); // コピー
activeDocument.close(SaveOptions.DONOTSAVECHANGES);
open(motoFile);
chObj = activeDocument.channels[3]; // アルファチャンネル1を読み込み
activeDocument.selection.load(chObj); // アルファチャンネルを選択
activeDocument.paste(true); // 選択範囲内にペースト
savePSD(saveFolder+Text[0].split(".")[0]+".psd"); // ファイル保存
activeDocument.close(SaveOptions.DONOTSAVECHANGES);
}
}
}
// PSD形式で保存
function savePSD(psdFileObj)
{
var saveFileObj = new File(psdFileObj);
var psdOpt = new PhotoshopSaveOptions();
psdOpt.alphaChannels = true; // チャンネルを保存する
psdOpt.annotations = true;
psdOpt.embedColorProfile = false; // カラープロファイルは埋め込まない
psdOpt.layers = true; // レイヤー情報は保存する
psdOpt.spotColors = false;
activeDocument.saveAs(saveFileObj, psdOpt, true, Extension.LOWERCASE);
}

Photoshop形式で保存さえできれば、あとはどうにでもなります。Photoshop形式でなく直接透過GIF形式で保存することもできます。この場合は以下のスクリプトになります。

TABCODE = String.fromCharCode(9); // タブコード
motoFile = new File("/dgcr/moto.psd");
dataFile = new File("/dgcr/data.txt");
saveFolder = "/dgcr/result/";
imageFolder = "/dgcr/image/";

if (dataFile.open("r") == true)
{
while(!dataFile.eof)
{
tmp = dataFile.readln();
Text = tmp.split(TABCODE);
// ダブルクオーテーションの処理
for (i=0; i<Text.length; i++)
{
if (Text[i].charAt(0) == '"')
{
Text[i] = Text[i].substring(1,Text[i].length-1);
}
}
fileObj = new File(imageFolder+Text[0]);
if (fileObj.open("r") == true)
{
// 画像の配置
open(fileObj);
activeDocument.selection.selectAll(); // 全てを選択
activeDocument.activeLayer.copy(); // コピー
activeDocument.close(SaveOptions.DONOTSAVECHANGES);
open(motoFile);
chObj = activeDocument.channels[3]; // アルファチャンネル1を読み込み
activeDocument.selection.load(chObj); // アルファチャンネルを選択
activeDocument.paste(true); // 選択範囲内にペースト
saveGIF(saveFolder+Text[0].split(".")[0]+".gif"); // ファイル保存
activeDocument.close(SaveOptions.DONOTSAVECHANGES);
}
}
}
// GIF形式で保存
function saveGIF(sFileObj)
{
var saveFileObj = new File(sFileObj);
var gifOpt = new GIFSaveOptions(); // GIFオプション指定を行うオブジェクトを作成します
gifOpt.colors = 16; // 色数を16にします
gifOpt.dither = Dither.NONE; // ディザなしにします
gifOpt.interlacted = true; // インターレースONにします
gifOpt.matte = MatteType.WHITE; // マットカラーを白にします
gifOpt.palette = Palette.EXACT; // カラーパレットの種類を指定します
gifOpt.preserveExactColors = false; // 同一色の保持(しない)
gifOpt.transparency = true; // 背景透過(する)
activeDocument.saveAs(saveFileObj, gifOpt, true, Extension.LOWERCASE);
}

GIF形式の場合、いろいろなオプションが指定できます。PDFマニュアルを開くのも面倒でしょうし英語なので指定できるオプションを以下に載せておきます。

colors 色数(最大256。保存パレットの種類にもよる)
dither ディザ処理
Dither.DIFFUSION 誤差拡散
Dither.NOISE ノイズ
Dither.NONE なし
Dither.PATTERN パターン
ditherAmount ディザ処理の割合
forced 強制
ForcedColors.BLACKWHITE 白黒
ForcedColors.NONE なし
ForcedColors.PRIMARIES RGB色度座標
ForcedColors.WEB Web
interlaced インターレース(true:オン、false:オフ)
matte マット
MatteType.BACKGROUND 背景色
MatteType.BLACK 黒
MatteType.FOREGROUND 描画色(前景色)
MatteType.NETSCAPENONE Netscapeグレー
MatteType.SEMIGRAY 50%グレー
MatteType.WHITE 白
palette パレットの種類
Palette.EXACT 全ての色を割り付ける
Palette.LOCALADAPTIVE ローカル(割り付け)
Palette.LOCALPERCEPTUAL ローカル(知覚的)
Palette.LOCALSELECTIVE ローカル(特定)
Palette.MACOSPALETTE システム(Macintosh)
Palette.MASTERADAPTIVE マスター(割り付け)
Palette.MASTERPERCEPTUAL マスター(知覚的)
Palette.MASTERSELECTIVE マスター(特定)
Palette.PREVIOUSPALETTE 前回使用したパレット
Palette.UNIFORM RGBカラーを均等に割り付ける
Palette.WEBPALETTE Web
Palette.WINDOWSPALETTE システム(Windows)
preserveExactColors 同一色の保持(true:する、false:しない)
transparency 透明(true:透明にする、false:透明にしない)

注意しないといけないのはWeb用に保存で保存するGIFとは異なる点です。これはファイルメニューから別名で保存を選択してGIF形式で保存するのと同じなので環境設定によってはサムネールごと保存されてしまいます。つまり画像サイズが肥大化してしまうおそれがあります。これを回避するには環境設定でサムネールを保存しないように設定しておきます。これで、まあ普通の状態のGIF画像になります。




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