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

create selection with color sampler

Advocate ,
Dec 03, 2017 Dec 03, 2017

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
3.2K
Translate
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

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

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.

Translate
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

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 );

};

Translate
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

This already seems like a good thing

Thank you

Translate
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

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).

Translate
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

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

Translate
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

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

Translate
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

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.

Translate
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

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?

Translate
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
Translate
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
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.

Translate
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

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); }

    }

       

Translate
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

r-bin

perfect

Translate
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