有没有办法自动改变许多层的色调,每层具有不同的值?

平面设计 adobe-photoshop 批量处理 自动化 行动
2022-02-14 07:31:30

假设我在一个文件夹中有 100 张照片。在第一个上,我想将其更改Hue-180并保存。在第二个上,我想将其更改Hue-170. 在第三个上,我想将 更改Hue-160,依此类推。

有没有办法每次都以不同的值进行批处理?

3个回答

我可能会使用ImageMagick

有一个功能可以修改色调,但它是基于百分比而不是度数。

色调调制

以循环方式旋转图像的颜色。为了实现这一点,给定的色调值会产生“模数加法”,而不是乘法。但是请注意,色调是使用百分比而不是角度旋转的。

convert rose:   -modulate 100,100,0      mod_hue_0.gif
convert rose:   -modulate 100,100,33.3   mod_hue_33.gif
convert rose:   -modulate 100,100,66.6   mod_hue_66.gif
convert rose:   -modulate 100,100,100    mod_hue_100.gif
convert rose:   -modulate 100,100,133.3  mod_hue_133.gif
convert rose:   -modulate 100,100,166.6  mod_hue_166.gif
convert rose:   -modulate 100,100,200    mod_hue_200.gif

结果:

色调调制:0 色调调制:33.3 色调调制:66.6 色调调制:100 色调调制:133.3 色调调制:166.6 色调调制:200

在该示例中,大部分繁重的工作已经为您完成,您只需要创建一个脚本来索引目录中的所有文件并将给定的顺序值应用于 modulate 参数。

这可以通过 PS 脚本来完成。由于这是一个非常独特的请求,您可能很难找到执行此操作的现有脚本。您可能必须自己编写代码或聘请可以为您编写代码的人。

我有一个脚本可以做到这一点。只需将其另存为类似内容changeHuePerLayer.jsx,然后将其拖放到 Mac 上的 Photoshop 停靠图标顶部即可。在 Windows 上,我认为您需要从菜单中打开它(不确定在哪里)。

#target photoshop
app.bringToFront();

var
    LOWER_HUE_LIMIT = -180,
    UPPER_HUE_LIMIT = 180;
var
    hueValue = LOWER_HUE_LIMIT,
    hueIncrementor = 10,
    currentDoc = app.activeDocument;


for ( var i = 0; i < currentDoc.layers.length; i++ ) {
    currentDoc.activeLayer = currentDoc.layers[i];
    hueValue = hueValue < UPPER_HUE_LIMIT ? hueValue + hueIncrementor : LOWER_HUE_LIMIT;
    applyHsl( hueValue, 0, 0 );
}


/**
 *
 * @param {number} hue
 * @param {number} saturation
 * @param {number} lightness
 */
function applyHsl( hue, saturation, lightness ) {
    var HUE_SAT_ADJUSTMENT_V2_SYM  = 'Hst2';
    var COLORIZE_SYM               = 'Clrz';
    var ADJUSTMENT_SYM             = 'Adjs';
    var HUE_SYM                    = 'H   ';
    var SATURATION_SYM             = 'Strt';
    var LIGHTNESS_SYM              = 'Lght';
    var HUE_SATURATION_SYM         = 'HStr';

    var colorizeDescriptor = new ActionDescriptor();
    var hueSatDescriptor = new ActionDescriptor();
    var hueSatAdjustmentList = new ActionList();

    colorizeDescriptor.putBoolean( charIDToTypeID( COLORIZE_SYM ), false );

    hueSatDescriptor.putInteger( charIDToTypeID( HUE_SYM ), hue );
    hueSatDescriptor.putInteger( charIDToTypeID( SATURATION_SYM ), saturation );
    hueSatDescriptor.putInteger( charIDToTypeID( LIGHTNESS_SYM ), lightness );

    hueSatAdjustmentList.putObject( charIDToTypeID( HUE_SAT_ADJUSTMENT_V2_SYM ), hueSatDescriptor );
    colorizeDescriptor.putList( charIDToTypeID( ADJUSTMENT_SYM ), hueSatAdjustmentList );

    executeAction(
        charIDToTypeID( HUE_SATURATION_SYM ),
        colorizeDescriptor,
        DialogModes.NO
    );
}