Photoshopで開いている画像を、InDesignの貼り込みサイズに合わせてリサイズする

# Photoshopで開いている画像を、InDesignの貼り込みサイズに合わせてリサイズする

いろいろやってません。いろいろ環境依存です。そして継ぎ接ぎしました。
『カネムーメモ』http://blog.kanemu.net/
『なにする？DTP+WEB』http://d.hatena.ne.jp/kamiseto/
『chalcedonyの外部記憶装置・出張版』http://d.hatena.ne.jp/chalcedony_htn/
いつも大変お世話になっております。

それにしたってエラー処理も足りてないし、拡張子固定はしんどいので使いつつアップデートします。

## 更新履歴

20171105）スクリプトもくもく会で書き直し。Fileオブジェクトにして比較すれば濁点気にしなくてもOK→改修
なんでsortしてんのMaxでとればいいじゃん→改修

20171027）Photoshop側で画像を開いていないときにエラーにならないように。実行後Photoshopでスナップショット取得し、次回実行時に存在チェックしてあれば終了するように。

20170511）いわゆるApple Modified NFDに対応させるため、ファイル名をURLエンコードした上で
『【解決】スタイルにショートカットを割り当てたい！』http://sttk3.com/blog/tips/illustrator/apply-style-via-shortcut-key.html
こちらの変換Functionをお借りして変換してInDesignに渡す、という方法に変更しました。**これで濁点付きのファイル名でもなんとか動きます**。遅くなったけど……

20170514）geometricBoundsでサイズ取得すると、回転に対応できないためscaleを取って計算するようにしました（さらに取得方法間違ってた）。
ただし、このためにInDesign上でリンク更新しないままこのスクリプトを再度実行すると必要以上に縮小されます。使用に当たっては十分に注意してください。

20170514）InDesign上でリンクステータスがノーマル以外だと警告出すようにしましたが、「未保存の状態で」複数回実行した場合には同じことになります……

## 仕様等
- InDesignファイルが開いていること
- 貼り込まれている画像をPhotoshopで開いていること

現在、以上が前提です。Photoshop側から実行してください。

- Photoshopで開いている画像の名前を（今のところ）拡張子含めて取得
- indd内を名前で検索、一番scaleの大きい貼り込みサイズ（横）を取得
- 大きさが縮小になるようならバイキュービック（滑らか）で縮小
- 拡大になるようなら％表示して処理停止

var safetyで倍率を設定
var cRで解像度設定

動かないときは、BridgeTalkのお話先が見えていません。ESTKのappsアレイを参照して自分の環境に合わせてください。

※バイキュービック自動（またはシャープ）での縮小は、要らぬシャープ処理がかかってしまい、汚いので通常のバイキュービックを使います。
※拡大処理はpsの新しいアルゴリズムを使うか、普通にバイキュービックか、別のアプリケーションやプラグインを使うかは画像によって最適解が異なり過ぎますので今後も処理停止のままにします。



##　最新のコード

```js:PsinddResize.jsx
if(app.documents.length){
    app.activeDocument.suspendHistory("画像リサイズ","yamomain()");
}

function yamomain(){//スコープの関係で全部mainに収まってる
    
/*InDesignで実行する関数の定義。戻りメッセージには！を入れ、判別に使う*/

var func=function (Key){
if(app.documents.length){
app.scriptPreferences.measurementUnit = MeasurementUnits.MILLIMETERS;
var myLinks=app.activeDocument.links;
var arr=[];
var myLength = myLinks.length;
for (var i=0;i<myLength;i++){
    var mLink=File(myLinks[i].filePath);
    if (mLink==Key){　//同名リンクが存在
        if(myLinks[i].status==LinkStatus.normal){　//リンクステータスが正常
            arr.push(myLinks[i].parent.verticalScale);
        }else{
        return "！リンクが更新されていないため、正確な拡大率を取得できません。\rInDesignでリンクパネルを確認してください。";}
    }
}
if(arr.length!=0){
    return Math.max.apply(null,arr);
    }else{
    return "！この画像はInDesignドキュメント中に存在しません。";}　
} else {
return "！ドキュメントが開かれていません。";}
}

/*ここまでInDesignにBTで渡す用関数*/

/*単位保存*/

var myDoc = app.activeDocument;
var defRulerUnit=preferences.rulerUnits;


/*スナップショットに定義した名前が残ってたら、一度実行していると見なし終了*/

var myH=myDoc.historyStates;
var myHlength=myH.length; //ヒストリーを舐めるので必須
for(i=0;i<myHlength;i++){
    if(myH[i].snapshot && myH[i].name=="ResizeImagebyJS"){alert("実行済みです。\r強制的に実行するには、スナップショット「ResizeImagebyJS」を削除してください。");return;}
 }


/*BridgeTalk実行。ファイル名をURLエンコードしてInDesignに渡す*/

btFunc(File(myDoc.fullName)); 


/*戻り値を分けて実行*/

if(myRes.match ("^.")=="！"){ //！で始まる戻り値はメッセージとする
alert(myRes);return;//戻りのメッセージ表示して終了
}else{ //メッセージが無ければ戻り値を利用して……

/*ここからサイズ設定*/

var safety = 1; //拡大・縮小のセーフティ倍率設定
var cR=400; //解像度設定

/*サイズ変更計算と実行*/

preferences.rulerUnits=Units.PIXELS;
var oW = myDoc.width.value;
var oR = myDoc.resolution;
var oM=oW/oR*(myRes/100);
var tP=Math.ceil(oM*cR)*safety;
var tH=Math.round(tP/oW*100);

resizeConf(tP); //リサイズ実行
}

/*ヒストリースナップショット作成*/
var idMk = charIDToTypeID( "Mk  " );
var desc7 = new ActionDescriptor();
var idnull = charIDToTypeID( "null" );
var ref1 = new ActionReference();
var idSnpS = charIDToTypeID( "SnpS" );
ref1.putClass( idSnpS );
desc7.putReference( idnull, ref1 );
var idFrom = charIDToTypeID( "From" );
var ref2 = new ActionReference();
var idHstS = charIDToTypeID( "HstS" );
var idCrnH = charIDToTypeID( "CrnH" );
ref2.putProperty( idHstS, idCrnH );
desc7.putReference( idFrom, ref2 );
var idNm = charIDToTypeID( "Nm  " );
desc7.putString( idNm, """ResizeImagebyJS""" );
var idUsng = charIDToTypeID( "Usng" );
var idHstS = charIDToTypeID( "HstS" );
var idFllD = charIDToTypeID( "FllD" );
desc7.putEnumerated( idUsng, idHstS, idFllD );
executeAction( idMk, desc7, DialogModes.NO );

/*残り処理。単位戻してアクション実行*/
preferences.rulerUnits=defRulerUnit;
try{
app.doAction("USM","保存");
}catch (e){}


/*BridgeTalkでinDD呼び出し*/
//bt.target = apps[17];
function btFunc(arg){
var argObj="";
argObj="\""+arg+"\"";
var bt=new BridgeTalk();
bt.target="indesign";
bt.body = "var func="+func.toString();
bt.body += "func("+argObj+");";
bt.onResult = function(resObj) {
myRes=resObj.body;
}
bt.send(100000);
}

/*リサイズする関数*/

function resizeConf(mySize){
if (tH>100){alert("元画像が小さいため、約 "+tH+" %の拡大になります。\r拡大は手動で選択してください。","拡大になります");return;
}else{
myDoc.resizeImage (mySize,undefined,cR,ResampleMethod.BICUBIC);
    }
}
}
```

#ひとつまえ


```js:Psinddresize.jsx
/*Photoshopでファイルを開いているか*/

if(app.documents.length){
        app.activeDocument.suspendHistory("画像リサイズ","main()"); //あるなら実行
}



function main(){//スコープの関係で全部mainに収まってる
    
/*InDesignで実行する関数の定義。戻りメッセージには！を入れ、判別に使う*/

var func=function (Key){
if(app.documents.length){
app.scriptPreferences.measurementUnit = MeasurementUnits.MILLIMETERS;
var myLinks=app.activeDocument.links;
var arr=[];
var myLength = myLinks.length;
for (var i=0;i<myLength;i++){
    var mLink=encodeURIComponent(myLinks[i].name)
    if (mLink==Key){　//同名リンクが存在
        if(myLinks[i].status==LinkStatus.normal){　//リンクステータスが正常
            arr.push(myLinks[i]);
            }else{
                return "！リンクが更新されていないため、正確な拡大率を取得できません。\rInDesignでリンクパネルを確認してください。";}
    }
}
/*ソート。最大サイズが0に入る*/
if(arr.length!=0){
    arr.sort(function(a,b){
        if(a.parent.verticalScale>b.parent.verticalScale) return -1;
        if(a.parent.verticalScale<b.parent.verticalScale) return 1;
        return 0;
       });}else{　//アレイが空
            return "！この画像はInDesignドキュメント中に存在しません。";}　
        return arr[0].parent.verticalScale; //Scaleを返す
        } else {return "！ドキュメントが開かれていません。";}
}

/*ここまでInDesignにBTで渡す用関数*/


/*単位保存*/

var myDoc = app.activeDocument;
var defRulerUnit=preferences.rulerUnits;

/*BridgeTalk実行。ファイル名をURLエンコードしてInDesignに渡す*/

btFunc(combineDakuten (encodeURIComponent (myDoc.name))); 

/*スナップショットに定義した名前が残ってたら、一度実行していると見なし終了*/

var myH=myDoc.historyStates;
var myHlength=myH.length; //ヒストリーを舐めるので必須
for(i=0;i<myHlength;i++){
    if(myH[i].snapshot && myH[i].name=="ResizeImagebyJS"){alert("実行済みです。\r強制的に実行するには、スナップショット「ResizeImagebyJS」を削除してください。");return;}
 }

/*戻り値を分けて実行*/

if(myRes.match ("^.")=="！"){ //！で始まる戻り値はメッセージとする
alert(myRes);return;//戻りのメッセージ表示して終了
}else{ //メッセージが無ければ戻り値を利用して……

/*ここからサイズ設定*/

var safety = 1; //拡大・縮小のセーフティ倍率設定
var cR=400; //解像度設定

/*サイズ変更計算と実行*/

preferences.rulerUnits=Units.PIXELS;
var oW = myDoc.width.value;
var oR = myDoc.resolution;
var oM=oW/oR*(myRes/100);
var tP=Math.ceil(oM*cR)*safety;
var tH=Math.round(tP/oW*100);

resizeConf(tP); //リサイズ実行
}

/*ヒストリースナップショット作成*/
var idMk = charIDToTypeID( "Mk  " );
var desc7 = new ActionDescriptor();
var idnull = charIDToTypeID( "null" );
var ref1 = new ActionReference();
var idSnpS = charIDToTypeID( "SnpS" );
ref1.putClass( idSnpS );
desc7.putReference( idnull, ref1 );
var idFrom = charIDToTypeID( "From" );
var ref2 = new ActionReference();
var idHstS = charIDToTypeID( "HstS" );
var idCrnH = charIDToTypeID( "CrnH" );
ref2.putProperty( idHstS, idCrnH );
desc7.putReference( idFrom, ref2 );
var idNm = charIDToTypeID( "Nm  " );
desc7.putString( idNm, """ResizeImagebyJS""" );
var idUsng = charIDToTypeID( "Usng" );
var idHstS = charIDToTypeID( "HstS" );
var idFllD = charIDToTypeID( "FllD" );
desc7.putEnumerated( idUsng, idHstS, idFllD );
executeAction( idMk, desc7, DialogModes.NO );

/*残り処理。単位戻してアクション実行*/
preferences.rulerUnits=defRulerUnit;
try{
app.doAction("USM","保存");
}catch (e){}


/*BridgeTalkでinDD呼び出し*/
//bt.target = apps[17];
function btFunc(arg){
var argObj="";
argObj="\""+arg+"\"";
var bt=new BridgeTalk();
bt.target="indesign";
bt.body = "var func="+func.toString();
bt.body += "func("+argObj+");";
bt.onResult = function(resObj) {
myRes=resObj.body;
}
bt.send(100000);
}

/*リサイズする関数*/

function resizeConf(mySize){
if (tH>100){alert("元画像が小さいため、約 "+tH+" %の拡大になります。\r拡大は手動で選択してください。","拡大になります");return;
}else{
myDoc.resizeImage (mySize,undefined,cR,ResampleMethod.BICUBIC);
    }
}


/*以降の関数は、http://sttk3.com/blog/tips/illustrator/apply-style-via-shortcut-key.htmlよりお借りしました*/

/*
  * 分割された濁点・半濁点を結合された文字にする。ウムラウトなどは無視する
  * @param {String} str 対象の文字列。URIエンコードされたもの
  * @return {String} 変換されたテキスト
*/


function combineDakuten(str) {
  // 置換対象の文字とその順番
  // ゔがぎぐげござじずぜぞだぢづでどばぱびぴぶぷべぺぼぽヴガギグゲゴザジズゼゾダヂヅデドバパビピブプベペボポ
  
  // 分割された文字
  var nfd = ['%E3%81%86%E3%82%99', '%E3%81%8B%E3%82%99', '%E3%81%8D%E3%82%99', '%E3%81%8F%E3%82%99', '%E3%81%91%E3%82%99', '%E3%81%93%E3%82%99', '%E3%81%95%E3%82%99', '%E3%81%97%E3%82%99', '%E3%81%99%E3%82%99', '%E3%81%9B%E3%82%99', '%E3%81%9D%E3%82%99', '%E3%81%9F%E3%82%99', '%E3%81%A1%E3%82%99', '%E3%81%A4%E3%82%99', '%E3%81%A6%E3%82%99', '%E3%81%A8%E3%82%99', '%E3%81%AF%E3%82%99', '%E3%81%AF%E3%82%9A', '%E3%81%B2%E3%82%99', '%E3%81%B2%E3%82%9A', '%E3%81%B5%E3%82%99', '%E3%81%B5%E3%82%9A', '%E3%81%B8%E3%82%99', '%E3%81%B8%E3%82%9A', '%E3%81%BB%E3%82%99', '%E3%81%BB%E3%82%9A', '%E3%82%A6%E3%82%99', '%E3%82%AB%E3%82%99', '%E3%82%AD%E3%82%99', '%E3%82%AF%E3%82%99', '%E3%82%B1%E3%82%99', '%E3%82%B3%E3%82%99', '%E3%82%B5%E3%82%99', '%E3%82%B7%E3%82%99', '%E3%82%B9%E3%82%99', '%E3%82%BB%E3%82%99', '%E3%82%BD%E3%82%99', '%E3%82%BF%E3%82%99', '%E3%83%81%E3%82%99', '%E3%83%84%E3%82%99', '%E3%83%86%E3%82%99', '%E3%83%88%E3%82%99', '%E3%83%8F%E3%82%99', '%E3%83%8F%E3%82%9A', '%E3%83%92%E3%82%99', '%E3%83%92%E3%82%9A', '%E3%83%95%E3%82%99', '%E3%83%95%E3%82%9A', '%E3%83%98%E3%82%99', '%E3%83%98%E3%82%9A', '%E3%83%9B%E3%82%99', '%E3%83%9B%E3%82%9A'] ;
  
  // 結合された文字
  var nfc = ['%E3%82%94', '%E3%81%8C', '%E3%81%8E', '%E3%81%90', '%E3%81%92', '%E3%81%94', '%E3%81%96', '%E3%81%98', '%E3%81%9A', '%E3%81%9C', '%E3%81%9E', '%E3%81%A0', '%E3%81%A2', '%E3%81%A5', '%E3%81%A7', '%E3%81%A9', '%E3%81%B0', '%E3%81%B1', '%E3%81%B3', '%E3%81%B4', '%E3%81%B6', '%E3%81%B7', '%E3%81%B9', '%E3%81%BA', '%E3%81%BC', '%E3%81%BD', '%E3%83%B4', '%E3%82%AC', '%E3%82%AE', '%E3%82%B0', '%E3%82%B2', '%E3%82%B4', '%E3%82%B6', '%E3%82%B8', '%E3%82%BA', '%E3%82%BC', '%E3%82%BE', '%E3%83%80', '%E3%83%82', '%E3%83%85', '%E3%83%87', '%E3%83%89', '%E3%83%90', '%E3%83%91', '%E3%83%93', '%E3%83%94', '%E3%83%96', '%E3%83%97', '%E3%83%99', '%E3%83%9A', '%E3%83%9C', '%E3%83%9D'] ;
  
  for(var i = 0, len = nfd.length ; i < len ; i++) {
    str = str.replace(new RegExp(nfd[i], 'ig'), nfc[i]) ;
  }
  
  return str ;
}
}
```


## 旧コード

```js:PSinddresize.jsx

/*InDesignで実行する関数の定義*/

var func=function (Key){
app.scriptPreferences.measurementUnit = MeasurementUnits.MILLIMETERS;
var myLinks=app.activeDocument.links;
var arr=[];
for (var i=0;i<myLinks.length;i++){
    var mLink=encodeURIComponent(myLinks[i].name)
    if (mLink==Key){　//同名リンクが存在
        if(myLinks[i].status==LinkStatus.normal){　//リンクステータスが正常
            arr.push(myLinks[i]);
            }else{
                return "！リンクが更新されていないため、正確な拡大率を取得できません。二度実行した可能性があります。";}
    }
}
/*ソート。最大サイズが0に入る*/
if(arr.length!=0){
    arr.sort(function(a,b){
        if(a.parent.verticalScale>b.parent.verticalScale) return -1;
        if(a.parent.verticalScale<b.parent.verticalScale) return 1;
        return 0;
       });}else{　//アレイが空
            return "！画像はinddドキュメント中に存在しません。";}　
        return arr[0].parent.verticalScale; //Scaleを返す
}

/*URLエンコードしたファイル名をBridgeTalk経由でInDesignに渡す*/
var myDoc = app.activeDocument;
var defRulerUnit=preferences.rulerUnits;
btFunc(combineDakuten (encodeURIComponent (myDoc.name)));

/*戻り値を分けて実行*/

if(myRes.match ("^.")=="！"){ //戻りが全部stringなので……
alert(myRes);//戻りのメッセージ表示して終了
}else{
var safety = 1.05; //拡大・縮小のセーフティ倍率設定
var cR=400; //解像度設定
preferences.rulerUnits=Units.PIXELS;
var oW = myDoc.width.value;
var oR = myDoc.resolution;
var oM=oW/oR*(myRes/100);
var tP=Math.ceil(oM*cR)*safety;
var tH=Math.round(tP/oW*100);
resizeConf(tP);
}
preferences.rulerUnits=defRulerUnit;

/*BridgeTalkでinDD呼び出し*/

function btFunc(arg){
var argObj="";
argObj="\""+arg+"\"";
var bt=new BridgeTalk();
bt.target = apps[17];
bt.body = "var func="+func.toString();
bt.body += "func("+argObj+");";
bt.onResult = function(resObj) {
myRes=resObj.body;
}
bt.send(100000);
}

/*リサイズする関数*/

function resizeConf(mySize){
if (tH>100){alert("元画像が小さいため、約 "+tH+" %の拡大になります。\r拡大は手動で選択してください。","拡大になります");return;
}else{
myDoc.resizeImage (mySize,undefined,cR,ResampleMethod.BICUBIC);
    }
}


/*以降のFunctionは、http://sttk3.com/blog/tips/illustrator/apply-style-via-shortcut-key.htmlよりお借りしました。追記してください*/




```
## 古いコード

```js:psinddresize.jsx_OLD
var myDoc = app.activeDocument;

/*InDesignリンクからファイルネームで検索して、Scaleの大きい順にソート*/

var func=function (Key){
app.scriptPreferences.measurementUnit = MeasurementUnits.MILLIMETERS;
var myDoc = app.activeDocument;
var myLinks=myDoc.links.everyItem().parent;
var arr=[];
    for (var i=0;i<myLinks.length;i++){
        var mLink=encodeURIComponent(myLinks[i].itemLink.name)
        if (mLink==Key){
            arr.push(myLinks[i]);
        }
    }

if(arr.length!=0){
    arr.sort(function(a,b){
        if(a.verticalScale>b.verticalScale) return -1;
        if(a.verticalScale<b.verticalScale) return 1;
        return 0;
        });}
        
var re =arr[0].verticalScale;
return re;
}

/*BridgeTalkでinDD呼び出し*/

function btFunc(arg){
    try{
var argObj="";
argObj="\""+arg+"\"";
//alert(argObj);
var bt=new BridgeTalk();
bt.target = apps[17];
bt.body = "var func="+func.toString();
bt.body += "func("+argObj+");";
bt.onResult = function(resObj){
    myResHS=resObj.body;
    return;
}
bt.send(2);
 }catch(e){throw(e);}}

/*URLエンコードしたファイル名をBridgeTalk経由でInDesignに渡す*/

btFunc(combineDakuten(encodeURIComponent (myDoc.name)));


var safety = 1.1; //拡大・縮小のセーフティ倍率設定
var cR=400; //解像度設定
var defRulerUnit=preferences.rulerUnits;
preferences.rulerUnits=Units.PIXELS;
var oW = myDoc.width.value;
var oR = myDoc.resolution;
var oM=oW/oR*(myResHS/100);
var tP=Math.ceil(oM*cR)*safety;
var tH=Math.round(tP/oW*100);

/*リサイズ実行*/
resizeConf(tP);
preferences.rulerUnits=defRulerUnit;


/*リサイズする関数*/

function resizeConf(mySize){
if (tH>100){alert("元画像が小さいため、約 "+tH+" %の拡大になります。\r拡大は手動で選択してください。","拡大になります");return;
}else{
myDoc.resizeImage (mySize,undefined,cR,ResampleMethod.BICUBIC);
    }
}

/*以降のFunctionは、http://sttk3.com/blog/tips/illustrator/apply-style-via-shortcut-key.htmlよりお借りします。追記してください*/





```



```js:Psinddresize_OLD.jsx

var myDoc = app.activeDocument;

/*InDesignリンクからファイルネームで検索して、Scaleの大きい順にソート*/

var func=function (Key){
app.scriptPreferences.measurementUnit = MeasurementUnits.MILLIMETERS;
var safety = 1.1;
var myDoc = app.activeDocument;
var myLinks=myDoc.links.everyItem().parent;
var arr=[];
    for (var i=0;i<myLinks.length;i++){
        var mLink=encodeURIComponent(myLinks[i].itemLink.name)
        if (mLink==Key){
            arr.push(myLinks[i]);
        }
    }
if(arr.length!=0){
    arr.sort(function(a,b){
        if(a.verticalScale>b.verticalScale) return -1;
        if(a.verticalScale<b.verticalScale) return 1;
        return 0;
        });}
var re =(arr[0].geometricBounds[3]-arr[0].geometricBounds[1])*safety;
return re;
}

/*BridgeTalkでinDD呼び出し*/

function btFunc(arg){
    try{
var argObj="";
argObj="\""+arg+"\"";
//alert(argObj);
var bt=new BridgeTalk();
bt.target = apps[17];
bt.body = "var func="+func.toString();
bt.body += "func("+argObj+");";
bt.onResult = function(resObj){
    myResHS=resObj.body;
    return;
}
bt.send(2);
 }catch(e){throw(e);}}

/*リンクファイルのサイズが返って欲しい*/

btFunc(combineDakuten(encodeURIComponent (myDoc.name)));

var cR=400;
var cWp=Math.ceil(myResHS/25.4*cR);
var defRulerUnit=preferences.rulerUnits;
preferences.rulerUnits=Units.PIXELS;
var oW = myDoc.width;
var oH = myDoc.height;
var oR = myDoc.resolution;
var confPer = Math.round(cWp/oW*100);

//alert(oW);

resizeConf(cWp);
preferences.rulerUnits=defRulerUnit;

function resizeConf(mySize){
if (confPer>100){alert("元画像が小さいため、約 "+confPer+" %の拡大になります。\r拡大は手動で選択してください。","拡大になります");return;
   
}else{
//alert(cWp);
myDoc.resizeImage (mySize,undefined,cR,ResampleMethod.BICUBIC);
 
    }
}

/*この後にcombineDakutenを追加*/
 
```