こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

このスクリプトにアレンジを加えたいのですが...。

イラストレーターに貼り付けた画像をフォトショップで適した解像度に修正してくれるスクリプトなのですが、どなたかこのスクリプトをどうにか
Photoshopの画像解像度の「スタイルを拡大・縮小」と「縦横比固定」と「画像の再サンプル」すべてにチェックを入れた状態で起動するようにアレンジしていただけないでしょうか?

(現状だとスタイルを拡大・縮小にチェックが入っていないようで画像に
レイヤー効果が使用されていると不具合が生じます。)
(illustratorでリンク画像を選択→ExtendScript Toolkitでスクリプト起動→Photoshopで画像変換)


なおこのスクリプトのソース元は ttp://d.hatena.ne.jp/kamiseto/20090610/1244628779 です。


#include 'c.js';//http://svn.coderepos.org//share/platform/illustrator/javascript/lib/c.js
#include 'matrixConvert.jsx';//http://d.hatena.ne.jp/kamiseto/20090502/1241251512
#target 'illustrator';
(function(){
var default_reso = 350;
var reso = prompt ('解像度(pixel/inch)とを数字で入力してください。不正な文字が入力された場合はデフォルトの350pixel/inchで計算します。', 350, '解像度(pixel/inch)となる数字を入力して下さい。')*1;
if(reso == 0 || typeof reso !== 'number')reso = default_reso;

//Photoshop Resize Image Function
function ResizeImage(file,hs,vs,reso){
open(File(file));
var myDoc = app.activeDocument;
var hasClippingPath = (function(){
for(i=0;i<app.activeDocument.pathItems.length;i++)if(app.activeDocument.pathItems[i].kind == PathKind.CLIPPINGPATH)return true;
return false;
})();
var isPSD = (function(){
var f = new File(app.activeDocument.fullName);
f.open('r');
var h = (f.read('4'));
f.close();
return h == '8BPS' ? true : false;
})();
if(isPSD && hasClippingPath){
hs = hs*(myDoc.resolution/72);
vs = vs*(myDoc.resolution/72);
}
myDoc.resizeImage (UnitValue((myDoc .width.as('pixel'))*hs*reso/myDoc.resolution,'pixel'), UnitValue((myDoc .height.as('pixel'))*vs*reso/myDoc.resolution,'pixel'),reso, ResampleMethod.BICUBICSHARPER);
}

//
function FinalImageSize(ImgObj){
var info = getPlacedItemInfo(ImgObj);
if(info['type'] == 'PDF')return;
if(info['type'] == 'EPSF' && info['creator'].match(/Photoshop/) != 'Photoshop')return false;
var mat = matrixConvert.getAll(ImgObj);
//
if(0.7 < ((mat.hs*mat.vs)/10000) && ((mat.hs*mat.vs)/10000) < 1.3)return;
try{
var bt=new BridgeTalk();
bt.target = 'photoshop';
bt.body = uneval (ResizeImage)+"('"+ImgObj.file+"',"+mat.hs/100+","+mat.vs/100+","+reso+");";
bt.onError = function (btObj) {alert( btObj.body + " (" + btObj.headers ["Error-Code"] + ")" ); };
bt.send();
}catch(e){
throw(e);
}
}

function getPlacedItemInfo(pi){
if(pi.file.exists){
var info = {
'type' :'',
'creator' : '',
'color' : ''
};
var f = new File(pi.file);
var g = "";
var header = "";
f.open('r');
switch(g = f.read(4)){
case '8BPS' :
f.seek(0,0);
/*
while(header = f.readln()){
if(header)tmph = header;
};
f.seek((-1*tmph.length)-8,1);
*/
info['type'] = 'PSD';
break;
case '%!PS' :
f.seek(0,0);
var header = (f.read(1000));
info['type'] = 'EPSF';
//Creator
if(creator = header.match (/%%Creator:(.+)/))info['creator'] = creator[1];
//Duotobe
if(duotone = header.match(/%%DocumentCustomColors: \((.+)\)/))info['color'] =duotone[1];
//CMYK or GrayScales
if(colors = header.match (/%%DocumentProcessColors:\s(.+)/))info['color'] = colors[1];
break;
case '%PDF' :
info['type'] = 'PDF';
//break;

default :
/*
f.seek(0,0);
//$.writeln(g);
while(header = f.readln()){$.writeln(header);}
*/
break;
}
f.close();
}
return info;
}


c("S").filter("placedItems").each(FinalImageSize);
//FinalImageSize(app.activeDocument.placedItems[0]);
})();

投稿日時 - 2012-06-18 18:16:37

QNo.7541057

困ってます

質問者が選んだベストアンサー

WinXP、CS2で動作確認しました。
全部書くと長くなってしまいますので部分的に書きますね。

function ResizeImage(file,hs,vs,reso){
open(File(file));
(~16行省略~)
......ResampleMethod.BICUBICSHARPER);
}

↑この関数を
↓このように置き換えて実行してみてください。

function ResizeImage(file,hs,vs,reso){
open(File(file));
var desc = new ActionDescriptor();
desc.putUnitDouble( charIDToTypeID( 'Rslt' ), charIDToTypeID( '#Rsl' ), reso );
desc.putBoolean( stringIDToTypeID( 'scaleStyles' ), true );
desc.putBoolean( charIDToTypeID( 'CnsP' ), true );
desc.putEnumerated( charIDToTypeID( 'Intr' ), charIDToTypeID( 'Intp' ), stringIDToTypeID( 'bicubicSharper' ) );
executeAction( charIDToTypeID( 'ImgS' ), desc, DialogModes.NO );
}

投稿日時 - 2012-06-20 22:13:14

お礼

ありがとうございます。
無事こちらのスクリプトで思い通りの結果が得られました。
感謝感激です。

投稿日時 - 2012-06-21 17:50:22

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

PhotoshopCS4のJavascriptリファレンス見ました。

結論を言うと無理そうです。

このスクリプトで使用しているresizeImageメゾット(画像大きさ変更するところ)に、そのようなオプションができるようになっていませんでした。
他の設定なども見てみましたが該当箇所はなさそうです。

ひとつ試していただきたいのは、
何らかのテスト画像を開いて、一度、全てチェックを付けた状態で画像解像度変更を実行し、その後にスクリプトを実行してもダメでしょうか?

投稿日時 - 2012-06-18 18:30:30

お礼

早速の回答ありがとうございます。
テスト画像で、すべてチェックを付けた状態で試しても結果は同じでした。
やはりレイヤー効果を使用してるpsd画像を縮小したりすると効果部分がおかしくなってしまいます。
一度レイヤーを統合してしまえば問題なく使用できるのですが、可能であればレイヤーを活かしたまま使用したいのです。

投稿日時 - 2012-06-18 19:16:50

あなたにオススメの質問