Photoshopの最近のブログ記事

ごめんなさい、懺悔します。

以前から一部の自前のスクリプトで何故かExtendScript Toolkitが勝手に立ち上がるときがあるなと思っていたのですが、最近はほとんどESTKを使わない日々が続き、今日やっと理由がわかりました。(今はTextMate使い)

ExtendScript のスクリプトの中に $.writeln( ) や $.write( ) がある(コメントアウトされていない)と
InDesignのScriptPanelなどのアプリケーションから実行しても、裏で ExtendScript Toolkit が勝手に起動してしまう(CS3だとESTK2がDOMのXMLをちくちく読み込みに行き、そしてXML読み込みに失敗する)ことになるのを知りました。


estk_xml.png

$.writeln( ), $.write( )はちゃんとコメントアウトします。反省。

//ESTKを立ち上げていない状態で
//アプリケーションから実行すると、ESTKが立ち上がってくれます。
$.writeln("Hello ESTK from backyard");

大量の大判チラシのPDFからマメ画像を作るために、Photoshop CS3のスクリプトを書くはめに。(アクションでのバッチ処理でもよかったのですが、設定の仕方が悪いのか、pdf名の取得して同名ファイル保存ができずに、連番ファイル名とかしかできなかった...)
しかも参考にしたESTK2のヘルプのDOM Libraryの記述が適当すぎで泣けた。結局PDFのReferenceをみながらの作業。

幅高さを指定した開き方をするにしても、PDFOpenOptionsのconstrainProportions、width、heightプロパティが非推奨となっていてできなかったので、一度低解像度で開きPixel数を維持して高解像度に上げる方法をとってます(希望の解像度の○○%の画像にするような使い方)。とりあえずeps、psdでの書出し用です。たぶん開いた後に画像サイズを調整できると思いますが、今回は省略、書き換えたらいろいろ使い回せるのがアクションとは違ったScriptingの強みだなーと実感。

あと対象フォルダ内のpdfファイルリストを取得する際に、kanemuさんにTwitterで教えてもらった、dotファイル除去フィルターを取り入れてみました(72と88行目付近)。感謝。

//pdfを希望解像度で拡大縮小してepsとかpsdとかの画像にするスクリプト
//
//実行すると、変換するPDFフォルダ、書き出し先フォルダをきいてくるので
//選択、パラメーターの書き換えでEPS、PSD、拡大縮小率、解像度を指定します。

//パラメーター
var finalResolutionSetting=400; //最終的に希望する解像度
var devideWithPer=0.25; //希望する拡大縮小率
var saveAsEPS=false; //trueならEPS, falseならばPSD

//pdfがある対象フォルダを選択
var targetFolder=Folder.selectDialog ("select target folder");
if(targetFolder != null){
	//書き出し先のフォルダを選択
	var exportFolder=Folder.selectDialog ("select export folder");
	if(exportFolder != null){
		setPref(); //設定Fnへ
		if(saveAsEPS==true){ //EPS書き出しFnへ
			convertPDF2EPS(targetFolder, exportFolder, pdfOpenOpt, epsSaveOpt);
			}
		else{ //PSD書き出しFnへ
			convertPDF2PSD(targetFolder, exportFolder, pdfOpenOpt, psdSaveOpt);
			}
		}
	}

//PDF、EPS、PSDの入出力の設定をする
function setPref (){
	pdfOpenOpt = new PDFOpenOptions();
	with(pdfOpenOpt){
		antiAlias = true;
		cropPage=CropToType.MEDIABOX;
		//Deprecated for Adobe Photoshop CS3 / 非推奨で反映されないプロパティ
		//constrainProportions = ;
		//width = ;
		//height = ; 
		resolution = finalResolutionSetting * devideWithPer;
		mode = OpenDocumentMode.CMYK;
		bitPerChannel=BitsPerChannelType.EIGHT;
		page = 1;
		suppressWargings=true; //警告を非表示
		usePageNumber=true; //falseならば画像の番号になる。
		}

	epsSaveOpt = new EPSSaveOptions();
	with(epsSaveOpt){
		embedColorProfile = true;
		encoding = SaveEncoding.JPEGMAXIMUM;
		halftoneScreen = false;
		interpolation = false;
		preview = Preview.EIGHTBITTIFF; //DOM Libraryのうそつき(MacPreviewType)?
		psColorManagement = false;
		transferFunction = false;
		transparentWhites = false;
		vectorData = false;
		}
	
	psdSaveOpt = new PhotoshopSaveOptions();
	with(psdSaveOpt){
		alphaChannels = true;
		annotations = true;
		embedColorProfile = false;
		layers = false;
		spotColors = false;
		}
	return pdfOpenOpt, epsSaveOpt, psdSaveOpt
	}

//EPSにする
function convertPDF2EPS(targetFolder, exportFolder, pdfOpenOpt, epsSaveOpt){
	var pdfPath=new File(targetFolder).fsName;
	var pdfFileList=File(pdfPath).getFiles(
		function (file){
			return /^[^\.]+\.pdf$/i.test(file.name)
			});
	for(var i=0, L=pdfFileList.length; i < L; i++){
		app.open(pdfFileList[i], pdfOpenOpt);
		var fileObj = new File(exportFolder+"/"+pdfFileList[i].name.replace(/\.pdf/,".eps"));
		activeDocument.resizeImage (undefined, undefined, finalResolutionSetting, ResampleMethod.NONE);
		activeDocument.saveAs(fileObj, epsSaveOpt, true, Extension.LOWERCASE);
		activeDocument.close(SaveOptions.DONOTSAVECHANGES); //DOM Libraryのうそつき(SaveOptionsType)?
		}
	}

//PSDにする
function convertPDF2PSD(targetFolder, exportFolder, pdfOpenOpt, psdSaveOpt){
	pdfPath=new File(targetFolder).fsName;
	pdfFileList=File(pdfPath).getFiles(
		function (file){
			return /^[^\.]+\.pdf$/i.test(file.name)
			});
	for(var i=0, L=pdfFileList.length; i < L; i++){
		app.open(pdfFileList[i], pdfOpenOpt);
		var fileObj = new File(exportFolder+"/"+pdfFileList[i].name.replace(/\.pdf/,".psd"));
		activeDocument.resizeImage (undefined, undefined, finalResolutionSetting, ResampleMethod.NONE);
		activeDocument.flatten(); //画像を統合
		activeDocument.saveAs(fileObj, psdSaveOpt, true, Extension.LOWERCASE);
		activeDocument.close(SaveOptions.DONOTSAVECHANGES); //DOM Libraryのうそつき(SaveOptionsType)?
		}
	}
ExtendScriptの $オブジェクト(ヘルパーオブジェクト)は地味に便利です。
スクリプトを書くとき、デバッグに役立つのが $.writeln(message) や $.bp() や $.sleep() といったメソッド、また、多国語仕様にするときに役立つ $.localize などがあります。

そんな中に、実行途中でプレビューしながら色をつくるのに使えそうメソッドが
$.colorPicker();
ということで試してみました。たぶん、InDesignでもIllustratorでもPhotoshopでも使えます。

OSXの場合、こんなカラーピッカーが表示されます。

osxcolorpicker.png

//スクリプトの途中で色をプレビューしながら生成する
#target 'indesign';
var doc=app.documents.add();
var obj=doc.rectangles.add({geometricBounds:[20,20,150,150]});

var pick=$.colorPicker ();
if(pick==-1){exit();}
var pick16=pick.toString(16);

//Rが一桁のとき色が大ずれするのを回避
if(pick16.length==5){pick16="0"+pick16;}

col=doc.colors.add ({
	space:ColorSpace.RGB, 
	colorValue:[
		parseInt(pick16.substr (0, 2), 16),
		parseInt(pick16.substr (2, 2), 16),
		parseInt(pick16.substr (4, 2), 16)
		]})

//ここからRGBからCMYK変換、色が転びます
/*
col.space=ColorSpace.CMYK;

var cmyk=col.colorValue;
var valC=Math.round(cmyk[0]);
var valM=Math.round(cmyk[1]);
var valY=Math.round(cmyk[2]);
var valK=Math.round(cmyk[3]);
col.colorValue=[valC, valM, valY, valK];
	
var nameC="C="+Math.round(valC)
var nameM=" M="+Math.round(valM)
var nameY=" Y="+Math.round(valY)
var nameK=" K="+Math.round(valK)

col.name=nameC+nameM+nameY+nameK;
*/
//CMYK変換ここまで

obj.fillColor=col;

.colorPicker()の戻り値がRGBなのでカラーピッカーでCMYKを選んでも、CMYK〜RGB〜CMYKと変換されるので選んだ通りの数値になりません。Kulerもいっしょ。
JavaScript(ExtendScript)でアラートをスキップしてしまいたいようなとき。
または、ダイアログがでるようにリセット(おまじない)したいとき。
InDesign, Illustrator, Photoshopで違っているのでメモ。

#target 'indesign'
//ダイアログもアラートも出す
app.scriptPreferences.userInteractionLevel=UserInteractionLevels.INTERACT_WITH_ALL;

//ダイアログもアラートも出さない
app.scriptPreferences.userInteractionLevel=UserInteractionLevels.NEVER_INTERACT;

//ダイアログさない、アラートは出す。
app.scriptPreferences.userInteractionLevel=UserInteractionLevels.INTERACT_WITH_ALERTS;

#target 'illustrator'
//ダイアログ出さない
app.userInteractionLevel=UserInteractionLevel.DONTDISPLAYALERTS;

//ダイアログ出す
app.userInteractionLevel=UserInteractionLevel.DISPLAYALERTS;
#target 'photoshop'
//ダイアログもアラートも出す
app.displayDialog=DialogModes.ALL;

//ダイアログもアラートも出さない
app.displayDialog=DialogModes.NO;

//ダイアログさない、アラートは出す。
app.displayDialog=DialogModes.ERROR;

なぜかIllustratorだけ、2種類しかない。
ちょっとずつ違いと共通点を探してみる。Adobe CS3にて。
/*
全てのドキュメントを保存せずに閉じる
Photoshop, Illustrator, InDesign共用
*/ 
switch(app.name){
	case "Adobe Photoshop":
	case "Adobe Illustrator":
	while (app.documents.length>0){
		app.activeDocument.close(SaveOptions.DONOTSAVECHANGES);
	} break;

	case "Adobe InDesign":
	while (app.documents.length>0){
		app.activeDocument.close(SaveOptions.no);
	} break;
}
InDesignのSave Optionsが違う。

TranslateThis

このアーカイブについて

このページには、過去に書かれたブログ記事のうちPhotoshopカテゴリに属しているものが含まれています。

前のカテゴリはMusicです。

次のカテゴリはScriptUIです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

アーカイブ

Blog Parts