レイヤー、または選択範囲に自由変形を直接実行する関数はありませんので、アクションを動的に生成して実行する関数を作成しました。

※基本的な変形にのみ対応

// 自由変形
function act_distort(anchor, completion) {
    var actDesc= new ActionDescriptor();
    var actRef= new ActionReference();
    actRef.putEnumerated( charIDToTypeID('Lyr '), charIDToTypeID('Ordn'), charIDToTypeID('Trgt') );
    actDesc.putReference( charIDToTypeID('null'), actRef );
    if (arguments[2].offset){
        var subDesc1= new ActionDescriptor();
        subDesc1.putUnitDouble( charIDToTypeID('Hrzn'), charIDToTypeID('#Rlt'), arguments[2].offset[0] );
        subDesc1.putUnitDouble( charIDToTypeID('Vrtc'), charIDToTypeID('#Rlt'), arguments[2].offset[1] );
        actDesc.putObject( charIDToTypeID('Ofst'), charIDToTypeID('Ofst'), subDesc1 );
    }
    if (arguments[2].scaleX){
        actDesc.putUnitDouble( charIDToTypeID('Wdth'), charIDToTypeID('#Prc'), arguments[2].scaleX );
    }
    if (arguments[2].scaleY){
        actDesc.putUnitDouble( charIDToTypeID('Hght'), charIDToTypeID('#Prc'), arguments[2].scaleY );
    }
    if (arguments[2].rotate){
        actDesc.putUnitDouble( charIDToTypeID('Angl'), charIDToTypeID('#Ang'), arguments[2].rotate );
    }
    var subDesc2= new ActionDescriptor();
    var f= false;
    if (arguments[2].shearH){
        subDesc2.putUnitDouble( charIDToTypeID('Hrzn'), charIDToTypeID('#Ang'), arguments[2].shearH ); f=true;
    }
    if (arguments[2].shearV){
        subDesc2.putUnitDouble( charIDToTypeID('Vrtc'), charIDToTypeID('#Ang'), arguments[2].shearV ); f=true;
    }
    if (f) { actDesc.putObject( charIDToTypeID('Skew'), charIDToTypeID('Pnt '), subDesc2 ); }
    actDesc.putEnumerated( charIDToTypeID('FTcs'), charIDToTypeID('QCSt'), charIDToTypeID( anchor ) );
    actDesc.putEnumerated( charIDToTypeID('Intr'), charIDToTypeID('Intp'), stringIDToTypeID( completion ) ); 
    executeAction( charIDToTypeID('Trnf'), actDesc, DialogModes.NO );
}

レイヤーのみが選択された状態ではレイヤー全体が対象になり、選択範囲があればその範囲が対象となります。

 

<引数>

anchor string アンカーポイント
completion string 画像補完方式

 

「anchor」には、変形する際の基準点(アンカーポイント)を、対応する文字列で渡します(下記の表・右列)。

ニアレストネイバー Nrst
バイリニア Blnr
バイキューブリック Bcbc
バイキューブリック法(滑らか) bicubicSmoother
バイキューブリック法(シャープ) bicubicSharper
バイキューブリック自動 bicubicAutomatic

 

「completion」には、変形で合成されるピクセルの補完方式を、対応する文字列で渡します(下記の表・各2行目)。

<左上>
Qcs0
<上>
Qcs4
<右上>
Qcs1
<左>
Qcs7
<中央>
Qcsa
<右>
Qcs5
<左下>
Qcs3
<下>
Qcs6
<右下>
Qcs2

 

 第3引数には変形したい項目を連想配列で渡します(下記の表参照)。なお、画像の反転は拡大・縮小にマイナスの値を渡します(-100で完全に反転)。

offset 移動量 [水平, 垂直]。単位はピクセル
scaleX 水平の拡大・縮小率(マイナスで画像が反転)
scaleY 垂直の拡大・縮小率(マイナスで画像が反転)
rotate 回転角度(プラスで時計回り)
shearH 水平の傾斜の角度(プラスで左傾斜)
shearV 垂直傾斜の角度(プラスで左肩上がり)


 

<使用例>

第3引数は連想配列なのですべての項目を必要としていません。変形したい値のみを渡します。

// 垂直100ピクセル下に移動
act_distort('Qcsa', 'bicubicAutomatic', {offset: [0, 100]});
// 垂直水平を50%に (アンカーは左下/補完方式はバイキューブリック自動)
act_distort('Qcs3', 'bicubicAutomatic', {scaleX: 50, scaleY: 50});
// 右に45度回転、200ピクセル右に移動(アンカーはセンター/補完方式はバイキューブリック自動)
act_distort('Qcsa', 'bicubicAutomatic', {rotate: 45, offset: [200, 0]});
// 項目がたくさんある場合はこのような書きかたで...
var prop={
    offset: [0, 0],
    scaleX: 100,
    scaleY: 0,
    rotate: 0,
    shearH: 0,
    shearV: 0
}
act_distort('Qcsa', 'bicubicAutomatic', prop);

 

Joomla templates by a4joomla