//  トーンカーブ
function act_toneCurve () {
    var setPoint= function (pt){
        var desc = new ActionDescriptor();
        desc.putDouble( charIDToTypeID('Hrzn'), pt[0] ); // X座標
        desc.putDouble( charIDToTypeID('Vrtc'), pt[1] ); // Y座標
        return desc;
    }
    var subDesc= function (prop){
        var channel= {'MS':'Cmps', 'RD':'Rd  ', 'GR':'Grn ', 'BL':'Bl  ', 'CY':'Cyn ', 'MG':'Mgnt', 'YW':'Yllw', 'K':'Blck', 'GY':'Trgt', 'L':'Lght', 'A':'A   ', 'B':'B   ' };
        var desc= new ActionDescriptor();
        var ref= new ActionReference();
        if (channel=='GY') {
             ref1.putEnumerated( charIDToTypeID('Chnl'), charIDToTypeID('Ordn'), charIDToTypeID('Trgt') );
        } else {
            ref.putEnumerated( charIDToTypeID('Chnl'), charIDToTypeID('Chnl'), charIDToTypeID( channel [prop.ch] ) );
        }
        desc.putReference( charIDToTypeID('Chnl'), ref );
        var crv= new ActionList();
        for (var i=0; i < prop.pt.length; i++) {
            crv.putObject( charIDToTypeID('Pnt '), setPoint( prop.pt[i] ) );
        }
        desc.putList( charIDToTypeID('Crv '), crv );
        return desc;
    } 
    var cList= new ActionList();
    if (arguments.length == 0) {
        // 自動補正
        var desc= new ActionDescriptor();
        var ref= new ActionReference();
        ref.putEnumerated( charIDToTypeID('Chnl'), charIDToTypeID('Chnl'), charIDToTypeID('Cmps') );
        desc.putReference( charIDToTypeID('Chnl'), ref );
        desc.putBoolean( stringIDToTypeID('autoMachineLearning'), true );
        desc.putBoolean( stringIDToTypeID('autoFaces'), true );
        cList.putObject( charIDToTypeID('CrvA'), desc );
    } else {
        // チャンネルの数だけ繰り返す
        for (var i=0; i < arguments.length; i++) {
            cList.putObject( charIDToTypeID('CrvA'), subDesc( arguments[i] ) );
        }
    }
    var actDesc= new ActionDescriptor();
    actDesc.putList( charIDToTypeID('Adjs'), cList );
    executeAction( charIDToTypeID('Crvs'), actDesc, DialogModes.NO ); 
}
// RGB
var ms= { ch: 'MS', pt: [ [0,0], [255.0,255.0] ] }
var r= { ch: 'RD', pt: [ [0,0], [255.0,255.0] ] }
var g= { ch: 'GR', pt: [ [0,0], [255.0,255.0] ] }
var b= { ch: 'BL', pt: [ [0,0], [255.0,255.0] ] }
act_toneCurve(ms, r, g, b);
// CMYK
var ms= { ch: 'MS', pt: [ [0,0], [255.0,255.0] ] }
var c= { ch: 'CY', pt: [ [0,0], [255.0,255.0] ] }
var m= { ch: 'MG', pt: [ [0,0], [255.0,255.0] ] }
var y= { ch: 'YW', pt: [ [0,0], [255.0,255.0] ] }
var k= { ch: 'K', pt: [ [0,0], [255.0,255.0] ] }
act_toneCurve(ms, c, m, y, k);
// グレースケール
var gy= { ch: 'GY', pt: [ [0,0], [255.0,255.0] ] }
act_toneCurve(gy);
// Lab
var l= { ch: 'L', pt: [ [0,0], [255.0,255.0] ] }
var a= { ch: 'A', pt: [ [0,0], [255.0,255.0] ] }
var b= { ch: 'B', pt: [ [0,0], [255.0,255.0] ] }
act_toneCurve(l, a, b);
act_toneCurve(); // 自動補正

 

<引数>

調整したいチャンネルの設定を連想配列オブジェクトにして渡します。

ch string チャンネル識別子
pt array 座標の配列 [ [x, y]...]

 

「ch」は設定値がどのチャンネルのものなのかを識別する文字列です(下記の表参照)。「MS」はモードがRGB / CMYK時のマスターチャンネルです。なお、CMYKのときにRGBの値で渡すなど、異なるモードの値を渡すとエラーになります。

「pt」はトーンカーブの座標点の配列で、性質上、最低でも [x, y] の配列が2点分必要です。座標は必要な分だけ入れ込めます。S字カーブであれば以下のようになります。

var ms= { ch: 'MS', pt: [ [0,0], [84.0,40.0], [180.0,184.0], [255.0,255.0] ] }

「otp」は出力レベルの配列で、ダイアログ上の設定値を左から並べたものになります。

チャンネル 文字列
master
(RGB/CMYK時)
MS
R RD
G GR
B BL
C CY
M MG
Y YW
K K
グレー GY
L L
a A
b B

 

引数のオブジェクトは設定したいチャンネルだけを渡すことができます。

// マスターチャンネルのみ
var ms= { ch: 'MS', pt: [ [0,0], [255.0,255.0] ] }
act_toneCurve(ms);

// Rチャンネルのみ
var r= { ch: 'RD', pt: [ [0,0], [255.0,255.0] ] }
act_toneCurve(ms, r);

// マスターチャンネルとBチャンネル
var ms= { ch: 'MS', pt: [ [0,0], [255.0,255.0] ] }
var b= { ch: 'BL', pt: [ [0,0], [255.0,255.0] ] }
act_toneCurve(ms, b);

 

まったく引数を渡さない場合は自動補正になります。

act_toneCurve(); // 自動補正

 

この関数はRGB、CMYK、Lab、グレースケールに対応しています。ほかのモードについては各自で作り変えてみてください。

 

 

 

Joomla templates by a4joomla