公開日:2017年7月21日
過剰な解像度の画像が埋め込みにされている場合、それを適正解像度に戻すのに役に立ちました(リンクに戻して修正すればいいじゃないとも思いましたが結構数が多かったのでラスタライズで対処)。
rasterizeメソッド、「ラスタライズ範囲の設定値は省略可能」みたいなことがオブジェクトモデルビューアに書いてあったのに、いざ省略すると動かなかった…というわけで選択したオブジェクトのサイズを取得してそれを基準にしています。
var selObj= activeDocument.selection;
//ラスタライズオプションの設定
var RasOpt=new RasterizeOptions();
with(RasOpt){
padding=0; //オブジェクトの周りに[n]mm追加
resolution=350; //解像度
transparency=false; //背景を透過するか。trueで透明に
}
//実際の処理
for(i=0; i < selObj.length; i++){
var x1 = selObj[i].visibleBounds[0];
var y1 = selObj[i].visibleBounds[1];
var x2 = selObj[i].visibleBounds[2];
var y2 = selObj[i].visibleBounds[3];
var objWidth = x2-x1;
var objHeight = y2-y1;
activeDocument.rasterize(selObj[i],[x1, y1, x1+objWidth, y1+objHeight],RasOpt)
}
こちらのスクリプトは、ラスタライズ後も選択を維持されます。
このスクリプトを使うときのオペレーションは「選択→当スクリプト実行」となるので、「並び順」は変わらない値といえます。
そのため、並び順(absoluteZOrderPosition)を基準としたオブジェクト比較に変更。ラスタライズ前に選択したオブジェクトの並び順と全ラスターアイテムの並び順とで一致するものを抽出し再度選択、という処理になっています。
//ラスタライズオプションの設定
var RasOpt=new RasterizeOptions();
with(RasOpt){
padding=0; //オブジェクトの周りに[n]mm追加
resolution=350; //解像度
transparency=false; //背景を透過するか。trueで透明に
}
var pagObj=app.activeDocument.pageItems;
var Zos=[]//arr1
for(i=0; i < pagObj.length; i++){
if(pagObj[i].selected==true){
//実際の処理
Zos.push(pagObj[i].absoluteZOrderPosition)
var x1 = pagObj[i].visibleBounds[0];
var y1 = pagObj[i].visibleBounds[1];
var x2 = pagObj[i].visibleBounds[2];
var y2 = pagObj[i].visibleBounds[3];
var objWidth = x2-x1;
var objHeight = y2-y1;
activeDocument.rasterize(pagObj[i],[x1, y1, x1+objWidth, y1+objHeight],RasOpt)
}
}
//再度選択
var rasItems=app.activeDocument.rasterItems;//arr2
var j=0;
var k=0;
while(j < Zos.length){
if(rasItems[k].absoluteZOrderPosition==Zos[j]){
rasItems[k].selected=true;
j++
}
k++
}
下記のスクリプトはAdobeアプリで使う、というわけではありませんが、配列2つでそれぞれ個数が違う場合に使ったものです。
配列arr1とarr2を比べて、マッチした場合はarr1を1つ次のものに、arr1の最後になるまで処理を繰り返します。
今回の「選択しているオブジェクトをラスタライズするスクリプト」では、「選択したオブジェクトの並び順(少ない方の配列)」と「ドキュメント上のラスターアイテムの並び順(多い方の配列)」を比較する際の考え方として使用。
var arr1=[1,5,6];
var arr2=[1,2,3,4,5,6,7,8,9];
var i=0;
var j=0;
while(i < arr1.length){
if(arr1[i]==arr2[j]){
alert("マッチ")
i++
}
alert("マッチせず")
j++
}