2017/10/18

Photoshop Script シェイプサイズ取得の際の誤差

シェイプのサイズを取得すると1px誤差が出る現象。
おそらくPhotoshopの仕様なのでしょうが、シェイプ以外のサイズと比べる場合やオブジェクトに対して処理する場合にシェイプだけサイズがずれるのが気持ち悪いのでなんとかならないのかという話。
そこで解決策としてシェイプを選択しているときだけサイズを-1してやるというもの。
しかしそれだとシェイプがにじんでいるときは見事にズレます。
シェイプを適当に書くと確実にズレますし作業時にずれることはママあります。

さらにその解決策がこちら。
function select_shape(active_shape_name){
    var actName_dammy = activeDocument.activeLayer.name;
    var desc8 = new ActionDescriptor();
        var ref4 = new ActionReference();
        ref4.putProperty( charIDToTypeID( "Chnl" ), charIDToTypeID( "fsel" ) );
    desc8.putReference( charIDToTypeID( "null" ), ref4 );
        var ref5 = new ActionReference();
        ref5.putEnumerated( charIDToTypeID( "Path" ), charIDToTypeID( "Path" ), stringIDToTypeID( "vectorMask" ) );
        ref5.putName( charIDToTypeID( "Lyr " ), actName_dammy);
    desc8.putReference( charIDToTypeID( "T   " ), ref5 );
    desc8.putInteger( charIDToTypeID( "Vrsn" ), 1 );
    desc8.putBoolean( stringIDToTypeID( "vectorMaskParams" ), true );
    executeAction( charIDToTypeID( "setd" ), desc8, DialogModes.NO );
    var rect_a = activeDocument.selection.bounds;
    activeDocument.selection.deselect();
    return rect_a
}
シェイプを選択しているとき、シェイプから選択範囲を作成して、その選択範囲のサイズを取得すると誤差を丸めてくれます。
if(layType == "LayerKind.SOLIDFILL")layer_bounds = select_shape(layer);
呼び出す際は塗りつぶしレイヤーかどうかの判断をする必要がありますので上記のようにするとなんとなくエラーは減ると思います。

オブジェクトのサイズに対して処理をする場合にPhotoshop上で表示されるサイズを使用したいときに便利です。

2017/10/03

Photoshop script ファイルパスをファイルシステム形式で取得する

Photoshopから外部アプリケーションを使用してバッチ処理したいときなどに各種ファイルパスをOSの形式で取得する方法。
var SELF = File($.fileName).parent.fsName;
スクリプト自身の格納パスを絶対パスで取得。
スクリプトと各種バッチ用アプリケーションを一緒に格納したりするときに実行用で格納先の絶対パスを取得できて便利。
通常「$.fileName」は自身のファイル名も含めて取得しますが「.parent」でディレクトリのみ取得できます。
しかしながらJSX用のパス形式はバッチで使用する分には不都合がありますので。
「.fsName」でファイルシステムに合わせてくれます。
var outputDir = Folder.selectDialog (["Plese select output directory"]).fsName;
フォルダ選択ダイアログで選択したフォルダの絶対パスを取得。
「.selectDialog()」でフォルダ選択ダイアログを表示し取得したパスをファイルシステム形式に合わせます。
バッチ処理時に保存先や作業先を指定する際に便利です。