【JavaScript+Photoshop】画像の白色を透過させる


各チャンネルの色が乗った部分のみを抽出して乗算することで、白色を排除しています。
カラーモードは、RGB・CMYK・グレースケールに対応。

#target "Photoshop"


function CheckSelection()
{
    var select_bool = true;
    try
    {
        app.activeDocument.selection.bounds;
    }
    catch(e)
    {
        select_bool = false;
    }
    return select_bool;
}


try
{
    if (app.documents.length == 0){throw("ファイルが開かれていません。");}

    with(app.activeDocument)
    {
        var color_mode = mode;
        if ("DocumentMode.GRAYSCALE,DocumentMode.RGB,DocumentMode.CMYK".indexOf(color_mode.toString()) == -1)
        {
            throw("ファイルのカラーモードがRGB・CMYK・グレースケールのものしか処理できません。");
        }

        alert("処理実行します。途中でエラーが起きた場合は保存しないでください。");

        flatten();

        var doc_channels = channels;
        for (i=0; i<doc_channels.length; i++)
        {
            if (doc_channels[i].kind == ChannelType.COMPONENT)
            {
                selection.load(doc_channels[i]);
                selection.invert();

                var new_layer = artLayers.add();
                new_layer.name = "Finish";
                new_layer.blendMode = BlendMode.MULTIPLY;

                var channel_name = doc_channels[i].name;
                var solid_color = new SolidColor();
                if ("グレー,gray".indexOf(channel_name) != -1)
                {
                    solid_color.gray.gray = 100;
                }
                else if ("レッド,red".indexOf(channel_name) != -1)
                {
                    solid_color.rgb.red = 0;
                    solid_color.rgb.green = 255;
                    solid_color.rgb.blue = 255;
                }
                else if ("グリーン,green".indexOf(channel_name) != -1)
                {
                    solid_color.rgb.red = 255;
                    solid_color.rgb.green = 0;
                    solid_color.rgb.blue = 255;
                }
                else if ("ブルー,blue".indexOf(channel_name) != -1)
                {
                    solid_color.rgb.red = 255;
                    solid_color.rgb.green = 255;
                    solid_color.rgb.blue = 0;
                }
                else if ("シアン,cyan".indexOf(channel_name) != -1)
                {
                    solid_color.cmyk.cyan = 100;
                    solid_color.cmyk.magenta = 0;
                    solid_color.cmyk.yellow = 0;
                    solid_color.cmyk.black = 0;
                }
                else if ("マゼンタ,magenta".indexOf(channel_name) != -1)
                {
                    solid_color.cmyk.cyan = 0;
                    solid_color.cmyk.magenta = 100;
                    solid_color.cmyk.yellow = 0;
                    solid_color.cmyk.black = 0;
                }
                else if ("イエロー,yellow".indexOf(channel_name) != -1)
                {
                    solid_color.cmyk.cyan = 0;
                    solid_color.cmyk.magenta = 0;
                    solid_color.cmyk.yellow = 100;
                    solid_color.cmyk.black = 0;
                }
                else if ("ブラック,black".indexOf(channel_name) != -1)
                {
                    solid_color.cmyk.cyan = 0;
                    solid_color.cmyk.magenta = 0;
                    solid_color.cmyk.yellow = 0;
                    solid_color.cmyk.black = 100;
                }

                if (CheckSelection())
                {
                    selection.fill(solid_color, ColorBlendMode.NORMAL , 100, false);
                }
            }
        }

        selection.deselect();

        var doc_layers = layers;
        for (j=0; j<doc_layers.length; j++)
        {
            if (doc_layers[j].isBackgroundLayer){doc_layers[j].remove();}
        }

        if (layers.length != 1)
        {
            mergeVisibleLayers();
            artLayers[0].name = "Finish"
        }
        else
        {
            artLayers[0].blendMode = BlendMode.NORMAL;
        }

        alert("処理完了しました。");
    }
}
catch(err_str)
{
    alert(err_str);
}