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上で表示されるサイズを使用したいときに便利です。

0 件のコメント:

コメントを投稿