• Global community
    • Language:
      • Deutsch
      • English
      • Español
      • Français
      • Português
  • 日本語コミュニティ
    Dedicated community for Japanese speakers
  • 한국 커뮤니티
    Dedicated community for Korean speakers
Exit
0

create selection with color sampler

Advocate ,
Dec 03, 2017 Dec 03, 2017

Copy link to clipboard

Copied

Hello everybody

I would like to create a selection using the selected points of the color sampler

I tried ScriptingListenerJS but I could not

I know I could use the color range

but I would like to do it without opening this window.

TOPICS
Actions and scripting

Views

2.6K

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines

correct answers 1 Correct answer

Community Expert , Dec 03, 2017 Dec 03, 2017

This would create selections based on all the Colour Samplers’ colors in turn.

// 2017, use it at your own risk;

#target photoshop

var myDoc = activeDocument;

var theSamplers = myDoc.colorSamplers;

for (var m = 0; m < theSamplers.length; m++) {

myDoc.selection.deselect();

var theL = theSamplers.color.lab.l;

var theA = theSamplers.color.lab.a;

var theB = theSamplers.color.lab.b;

colorRange([theL, theA, theB], [theL, theA, theB], 40)

};

////// color range //////

function colorRange (theMin, theMax, theFuzzine

...

Votes

Translate

Translate
Adobe
Community Expert ,
Dec 03, 2017 Dec 03, 2017

Copy link to clipboard

Copied

Could you please elaborate about the exact nature and basis of the intended selection?

How do you select multiple Colour Samplers?

As far as I can tell they do not even have an »active« or »selected« property, so once they have been created with the Colour Sampler Tool they simply »are there«, so to speak.

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Dec 03, 2017 Dec 03, 2017

Copy link to clipboard

Copied

This would create selections based on all the Colour Samplers’ colors in turn.

// 2017, use it at your own risk;

#target photoshop

var myDoc = activeDocument;

var theSamplers = myDoc.colorSamplers;

for (var m = 0; m < theSamplers.length; m++) {

myDoc.selection.deselect();

var theL = theSamplers.color.lab.l;

var theA = theSamplers.color.lab.a;

var theB = theSamplers.color.lab.b;

colorRange([theL, theA, theB], [theL, theA, theB], 40)

};

////// color range //////

function colorRange (theMin, theMax, theFuzziness) {

// =======================================================

var idClrR = charIDToTypeID( "ClrR" );

    var desc13 = new ActionDescriptor();

    var idFzns = charIDToTypeID( "Fzns" );

    desc13.putInteger( idFzns, theFuzziness );

    var idMnm = charIDToTypeID( "Mnm " );

        var desc14 = new ActionDescriptor();

        var idLmnc = charIDToTypeID( "Lmnc" );

        desc14.putDouble( idLmnc, theMin[0] );

        var idA = charIDToTypeID( "A   " );

        desc14.putDouble( idA, theMin[1] );

        var idB = charIDToTypeID( "B   " );

        desc14.putDouble( idB, theMin[2] );

    var idLbCl = charIDToTypeID( "LbCl" );

    desc13.putObject( idMnm, idLbCl, desc14 );

    var idMxm = charIDToTypeID( "Mxm " );

        var desc15 = new ActionDescriptor();

        var idLmnc = charIDToTypeID( "Lmnc" );

        desc15.putDouble( idLmnc, theMax[0] );

        var idA = charIDToTypeID( "A   " );

        desc15.putDouble( idA, theMax[1] );

        var idB = charIDToTypeID( "B   " );

        desc15.putDouble( idB, theMax[2] );

    var idLbCl = charIDToTypeID( "LbCl" );

    desc13.putObject( idMxm, idLbCl, desc15 );

    var idcolorModel = stringIDToTypeID( "colorModel" );

    desc13.putInteger( idcolorModel, 0 );

executeAction( idClrR, desc13, DialogModes.NO );

};

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Advocate ,
Dec 03, 2017 Dec 03, 2017

Copy link to clipboard

Copied

This already seems like a good thing

Thank you

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
LEGEND ,
Dec 03, 2017 Dec 03, 2017

Copy link to clipboard

Copied

BT = '(function BT(v1, v2) {bt = new BridgeTalk(), bt.target = v1, \

bt.body = v2, bt.onResult = function(v) {return res = v.body} bt.send(2)})'

function rw(v1, v2, v3) {

     v2.open(v1), v1 < 'w' ? v3 = v2.read() : v2.write(v3), v2.close(); return v3

}

function log(v) {

     if ((prf = preferences).useHistoryLog) prf.useHistoryLog = false

     if ((fle = File('~/Desktop/Log.txt')).exists) fle.remove()

     if (v) {

          prf .useHistoryLog = true, prf.saveLogItemsFile = fle

          prf.editLogItems = EditLogItemsType.DETAILED

          prf.saveLogItems = SaveLogItemsType.LOGFILE

     }

}

if (!(len = (aD = activeDocument).colorSamplers.length)) log(true)

else {

     c = rw('r', File('~/Desktop/log.txt')).match(/[\d+,]{5,}(?= )/g)

     for(i in c) if (i < 8) c = (c.replace(/,/, '.'))

     for(str = '', i = 0; i <= (2 * len) - 1; i += 2) {

          str += ('[' + c + ', ' + c[i + 1] + '], ')

     }

     if (!eval($.getenv('arr'))) $.setenv('arr', eval('"[' + str.slice(0, -2) + ']"'))

     else {

          ARR = eval($.getenv('arr')), ARR = uneval(ARR.concat(eval

          (eval('"[' + str.slice(0, -2) + ']"')))), $.setenv('arr', ARR)

     }

     for(i = 0; i < (pnt = eval(eval('"[' + str.slice(0, -2) + ']"'))).length; i++) {

          wh = pnt, w = wh[0], h = wh[1];

          (sel = aD.selection).select([[w - .5, h - .5], [w + .5, h - .5],

          [w + .5, h + .5], [w - .5, h + .5]], SelectionType.EXTEND)

     }

     function sTT(v) {return stringIDToTypeID(v)}

     (ref1 = new ActionReference()).putEnumerated(

     sTT('colorSampler'), sTT('ordinal'), sTT('allEnum'));

     (dsc1 = new ActionDescriptor()).putReference(sTT('null'), ref1)

     executeAction(sTT('delete'), dsc1, DialogModes.NO), log(true)

}

if (len && eval($.getenv('arr'))) {

     (ref = new ActionReference()).putProperty(sTT('property'), sTT('tool'))

     if (ref.putClass(sTT('application')), typeIDToStringID(executeActionGet

     (ref).getEnumerationType(sTT('tool'))) == 'moveTool') {

          dst = '"' + aD.path + '/' + aD.name + '"'

          ENV = (function ENV(v, v1, v2) {

               for (arr = [], i = 0; i < v2.length; i++) {

                    arr.push("'" + new Color((new BitmapData

                    (new Thumbnail(File(v1)).spec, true))

                    .getPixel(v2[0] , v2[1])).toString().slice(3) + "'")

               }

               arr = '"' + arr + '"', colR = (function colR(v) {

                    function sTT(v) {return stringIDToTypeID(v)}; function cR(f, l0, a0,  b0, l1, a1, b1) {

                         (dsc1 = new ActionDescriptor()).putInteger(sTT('fuzziness'), f)

                         for(i = 0, n = 2; i < (arr = ['minimum', 'maximum']).length; i++) {

                              ln = "(D = dsc" + n + " = new ActionDescriptor()).putDouble"

                              ln +="(sTT('luminance'), arguments[1 + p = l1 ? (i * 3) : 0])"

                              eval(ln), n++, eval("D.putDouble(sTT('a'), arguments[2 + p])")

                              eval("D.putDouble(sTT('b'), arguments[3 + p])")

                              dsc1.putObject(sTT(arr), sTT('labColor'), D)

                         }

                         dsc1.putInteger(sTT('colorModel'), 0)

                         executeAction(sTT('colorRange'), dsc1, DialogModes.NO);

                    }

                    for(L = A = B = j = 0; j < (arr = eval('[' + v + ']')).length; j++) {

                         (col = new SolidColor).rgb.hexValue = arr

                         L += col.lab.l, A += col.lab.a, B += col.lab.b

                    }

                    function div(v) {return v / j}; cR(50, div(L), div(A), div(B))

               })

               eval("(" + v + ")('photoshop', '(' + " + colR.toString() + " + ')' + '([' + arr + '])')" )

           })

          sel.deselect(), eval(BT + "('bridge', '(' + " + ENV.toString() + " + ')' + \

          '(' + BT + ', ' + dst + ', ' + $.getenv('arr') + ')')"), $.setenv('arr', null)

     }

}

There are only 4 color samplers in Photoshop. This script let you imitiate much more of them. Simply put all 4 samplers on image and then play the script. It takes positions of samplers to memory and create 1x1 pixel squares in their places. Then you can play scirpt how many times you want and each time use up to 4 samplers again. When you are ready change current tool to Move tool and play script again. That change will be signal for script that you want to use all selected pixels (before samplers) to make colour range. (Script will add all 3 lab values to every 3 of other selected pixels separately, so value L to L, A to A, B to B of all pixels, and then each of these groups devide by pixels (samplers) length. FYI I used sessions variables (setenv, getenv) also took pixels color using BridgeTalk BitmapDatas getPixel() as well as Photoshop Log).

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Advocate ,
Dec 04, 2017 Dec 04, 2017

Copy link to clipboard

Copied

I can not use your script

I get an error in line 20

c = rw('r', File('~/Desktop/log.txt')).match(/[\d+,]{5,}(?= )/g) 

use mac with photoshop cc2014

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
LEGEND ,
Dec 05, 2017 Dec 05, 2017

Copy link to clipboard

Copied

I tested this script for many cases I didn't noticeded before once after I created it. Now I know there were some situations that it didn't want to work. Current verstion of script was changed in few parts that now it has not 86 but 104 lines. Detailed instruction how to use it as well as sole code you find on forums: Unlimited point samplers script - PS-SCRIPTS.COM

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
People's Champ ,
Dec 04, 2017 Dec 04, 2017

Copy link to clipboard

Copied

It's all good.

But do you know about the bug in the CC version Re: sampled colors in color range is not recorded by scripts
which can negate all your efforts to use the script with Color Range.

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
LEGEND ,
Dec 05, 2017 Dec 05, 2017

Copy link to clipboard

Copied

Thx for info about bug. I have CS6 EXTENDED on Windows 10 and there is no problem like you mentioned. Fortunatelly there were other problems in my script I solved, but if it is like in linked post maybe there will be another you found solution for. I only don't understand why that code you wrote in that theard you didn't use in this one to avoid wrong behaviour of Color Range? @geppettol66959005 uses like he said CC2014 so is there bug or not or your script for him doesn't need that correction?

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Advocate ,
Dec 06, 2017 Dec 06, 2017

Copy link to clipboard

Copied

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
People's Champ ,
Dec 06, 2017 Dec 06, 2017

Copy link to clipboard

Copied

LATEST

I'm thinking @geppettol66959005 asks questions from a purely academic interest and tries to just study the creation of scripts in Photoshop. This I understood on the issues that he asked me with personal messages.

Accordingly, my answers are also of an educational nature only. If a person wants to use my code, he will probably take into account those comments that I made about possible problems.

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
People's Champ ,
Dec 04, 2017 Dec 04, 2017

Copy link to clipboard

Copied

The correct function for this topic

color_range_from_samples(10)

function color_range_from_samples(fzns)

    {  

    try {  

        var sel_names = new Array(); 

        for (var i = 0; i < app.activeDocument.colorSamplers.length; i++)

            {

            app.activeDocument.selection.deselect();

            color_range(app.activeDocument.colorSamplers.color, fzns)

       

            if (has_selection()) sel_names.push(save_selection());

            }

        app.activeDocument.selection.deselect();

        for (var i = 0; i < sel_names.length; i++)

            {

            if (!i) load_selection(sel_names);

            else    add_selection(sel_names);

            del_selection(sel_names);

            }

        function color_range(color, fzns)

            {  

            try {  

                var d1 = new ActionDescriptor();

                d1.putInteger( charIDToTypeID( "Fzns" ), fzns );

                var d2 = new ActionDescriptor();

                d2.putDouble( charIDToTypeID( "Lmnc" ), color.lab.l );

                d2.putDouble( charIDToTypeID( "A   " ), color.lab.a );

                d2.putDouble( charIDToTypeID( "B   " ), color.lab.b );

                d1.putObject( charIDToTypeID( "Mnm " ), idLbCl = charIDToTypeID( "LbCl" ), d2 );

                var d2 = new ActionDescriptor();

                d2.putDouble( charIDToTypeID( "Lmnc" ), color.lab.l );

                d2.putDouble( charIDToTypeID( "A   " ), color.lab.a );

                d2.putDouble( charIDToTypeID( "B   " ), color.lab.b );

                d1.putObject( charIDToTypeID( "Mxm " ), charIDToTypeID( "LbCl" ), d2 );

                d1.putBoolean( charIDToTypeID( "Invr" ), false );

                d1.putInteger( stringIDToTypeID( "colorModel" ), 0 );

                executeAction( charIDToTypeID( "ClrR" ), d1, DialogModes.NO );

                }

            catch (e) { throw(e); }

            }

        function save_selection()

            {

            try {

                var name = Math.random().toString().substr(2);

                var d = new ActionDescriptor();

                var r = new ActionReference();

                r.putProperty( charIDToTypeID( "Chnl" ), charIDToTypeID( "fsel" ) );

                d.putReference( charIDToTypeID( "null" ), r );

                d.putString( charIDToTypeID( "Nm  " ), name );

                executeAction( charIDToTypeID( "Dplc" ), d, DialogModes.NO );

                return name;

                }

            catch (e) { throw(e); }

            }

       

        function load_selection(name)

            {

            try {

                var d = new ActionDescriptor();

                var r1 = new ActionReference();

                r1.putProperty( charIDToTypeID( "Chnl" ), charIDToTypeID( "fsel" ) );

                d.putReference( charIDToTypeID( "null" ), r1 );

                var r2 = new ActionReference();

                r2.putName( charIDToTypeID( "Chnl" ), name );

                d.putReference( charIDToTypeID( "T   " ), r2 );

                executeAction( charIDToTypeID( "setd" ), d, DialogModes.NO );

                }

            catch (e) { throw(e); }

            }

               

        function add_selection(name)

            {

            try {

                var d = new ActionDescriptor();

                var r1 = new ActionReference();

                r1.putName( charIDToTypeID( "Chnl" ), name );

                d.putReference( charIDToTypeID( "null" ), r1 );

                var r2 = new ActionReference();

                r2.putProperty( charIDToTypeID( "Chnl" ), charIDToTypeID( "fsel" ) );

                d.putReference( charIDToTypeID( "T   " ), r2 );

                executeAction( charIDToTypeID( "Add " ), d, DialogModes.NO );

                }

            catch (e) { throw(e); }

            }

               

        function del_selection(name)

            {

            try {

                var d = new ActionDescriptor();

                var r = new ActionReference();

                r.putName( charIDToTypeID( "Chnl" ), name );

                d.putReference( charIDToTypeID( "null" ), r );

                executeAction( charIDToTypeID( "Dlt " ), d, DialogModes.NO );

                }

            catch (e) { throw(e); }

            }

        function has_selection()

            {

            try

                {

                var r = new ActionReference();

                r.putProperty( charIDToTypeID( "Prpr" ), stringIDToTypeID( "selection" ) );

                r.putEnumerated( charIDToTypeID( "Dcmn" ), charIDToTypeID( "Ordn" ), charIDToTypeID( "Trgt" ) );

                if (executeActionGet(r).hasKey(stringIDToTypeID("selection"))) return true;

                return false;

                }

            catch (e) { throw(e); }

            }

        }

    catch (e) { _alert(e); }

    }

       

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Advocate ,
Dec 04, 2017 Dec 04, 2017

Copy link to clipboard

Copied

r-bin

perfect

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines