クリエイター手抜きプロジェクト[427]Illustrator CS6〜CC 2014編 四角形のパスで画像を切り抜く
── 古籏一浩 ──

投稿:  著者:



今回はリクエストネタです。Illustratorに配置した画像を、指定した四角形のパスで切り抜くスクリプトです。こう書くと簡単ですが、リンク画像を切り抜くので、Illustratorだけではできません。

別に画像を切り抜かなくても、クリッピングパス(マスク)を使えば同じようなことはできます。が、リンク元の画像を切り抜くことはできません。

元画像を切り抜くには、Illustrator単体では残念ながらできません。そこで、Photoshopと連携することになります。連携にはBridge Talkを利用します。

Bridge TalkはCS3から使えるのですが、CS3の頃は動作が安定せず期待通りに動作せず、ハングアップしたりなどの問題がありました。バージョンアップにともなって動作も安定しCS6以降では、割と安定して呼び出すことができます。

プログラマ系の連載ではないので細かい解説はなしということなので、実際のスクリプトを掲載します。




以下が実際のスクリプトですが、ふたつあります。cropImage.jsxのスクリプトでリンク先の画像を切り抜いた後に、Illustratorで再リンクのダイアログが表示され、画像が置換されます。

しかし、この後の処理が連続して行えないため、再リンクされた画像と四角形を選択し、サイズを調整した後に四角形を消去するスクリプト(fitImage.jsx)が必要になります。

このふたつのスクリプトですが、以下の手順に従って使用します。

(1)(リンク)画像を配置。この画像のデータは書き換えられるので要注意。
(2)画像の上に四角形を描画。この四角形の範囲にそって画像が切り抜かれます。
(3)画像と四角形を選択します。
(4)cropImage.jsxのスクリプトを実行します。
(5)再リンク確認のダイアログが出るので置き換えます。
(6)置き換わった画像と四角形の2つだけを選択します。
(7)fitImage.jsxのスクリプトを実行します。

●cropImage.jsx

// 選択した四角形に合わせて下にある画像を切り抜く
function cropImage(){
var selObj = app.activeDocument.selection;
if(selObj.length != 2){
alert("画像と四角形の2つだけを選択してください(奥に画像、手前に四角形)");
return;
}
if (selObj[1].typename != "PlacedItem"){
alert("画像が四角形のパスの下(背面)になっていません。前後関係を正しく設定してから実行してください");
return;
}
// 座標を読み出す
var rect = selObj[0]; // 四角形
var imgObj = selObj[1]; // リンク画像
// サイズ計算
var rX1 = rect.geometricBounds[0];
var rY1 = rect.geometricBounds[1];
var rX2 = rect.geometricBounds[2];
var rY2 = rect.geometricBounds[3];
var iX1 = imgObj.geometricBounds[0];
var iY1 = imgObj.geometricBounds[1];
var iX2 = imgObj.geometricBounds[2];
var iY2 = imgObj.geometricBounds[3];
var x1 = rX1 - iX1;
var y1 = Math.abs(rY1 - iY1);
var x2 = rX2 - iX1;
var y2 = Math.abs(rY2 - iY1);
var fileObj = imgObj.file;
var imageW = imgObj.width;
var imageH = imgObj.height;
// BridgeTalkを利用して画像をくり抜く
var bt = new BridgeTalk();
bt.target = BridgeTalk.getSpecifier("photoshop"); // CS6
var code = "var f = '"+fileObj.fsName+"';app.open(new File(f));";
code += "var x1 = UnitValue("+x1+", 'pt');";
code += "var y1 = UnitValue("+y1+", 'pt');";
code += "var x2 = UnitValue("+x2+", 'pt');";
code += "var y2 = UnitValue("+y2+", 'pt');";
code += "activeDocument.resizeImage(UnitValue("+imageW+", 'pt'), UnitValue("+imageH+", 'pt'));";
code += "activeDocument.crop([x1, y1, x2, y2]);activeDocument.save();";
//code += "activeDocument.close(saveOptions.DONOTSAVECHANGES);";
bt.body = code;
bt.send();
}
cropImage();

●fitImage.jsx

// 選択した四角形に画像位置とサイズを合わせる
(function (){
var selObj = app.activeDocument.selection;
if(selObj.length != 2){
alert("画像と四角形の2つだけを選択してください(奥に画像、手前に四角形)");
return;
}
if (selObj[1].typename != "PlacedItem"){
alert("画像が四角形のパスの下(背面)になっていません。前後関係を正しく設定してから実行してください");
return;
}
// 座標値をもとに設定
var rect = selObj[0]; // 四角形
var imgObj = selObj[1]; // リンク画像
var rX1 = rect.geometricBounds[0];
var rY1 = rect.geometricBounds[1];
var rX2 = rect.geometricBounds[2];
var rY2 = rect.geometricBounds[3];
imgObj.left = rX1;
imgObj.top = rY1;
imgObj.width = rect.width;
imgObj.height = rect.height;
rect.remove();
})();

なお、安全のため、Photoshopで切り抜いた画像はドキュメントを閉じない状態にしてあります。つまり、失敗しても取り消しができます。別に取り消しできなくてかまわないから、ドキュメントを閉じたいのであればcropImage.jsxの以下の行の先頭の//を削除してください。

//code += "activeDocument.close(saveOptions.DONOTSAVECHANGES);";

【古籏一浩】openspc@alpha.ocn.ne.jp
< http://www.openspc2.org/
>

田植えが終わって、とりあえず一段落。75%が6条植えの機械、20%が2条植えの機械、残りが手植えという状態なので、ちょっと筋肉痛。2時間くらい手で植えているとさすがに疲れます。農業やってみたい人がいたら、今のうち。というか、今がギリギリじゃないかなあ。今後5年くらいで、農業系の地元ならではの細かいノウハウが雲散霧消してしまうかと。

・Apple Watch(アップルウォッチ)使い方辞典
< http://www.openspc2.org/reibun/AppleWatch/2015/
>

・Photoshop自動化基本編
< http://www.amazon.co.jp/dp/B00W952JQW/
>

・Illustrator自動化基本編
< http://www.amazon.co.jp/dp/B00R5MZ1PA
>

・Adobe JavaScriptリファレンス
< http://www.amazon.co.jp/dp/B00FZEK6J6/
>

・ExtendScript Toolkit(ESTK)基本編
< http://www.amazon.co.jp/dp/B00JUBQKKY/
>

・データビジュアライゼーションのためのD3.js徹底入門
< http://www.amazon.co.jp/dp/4797368861
>

・4K/ハイビジョン映像素材集
< http://www.openspc2.org/HDTV/
>

・クリエイター手抜きプロジェクト
< http://www.openspc2.org/projectX/
>