Extracting Multiple Text Font Color

Anyone, especially newbies, asking for help with Photoshop Scripting and Photoshop Automation - as opposed to those contributing to discussion about an aspect of Photoshop Scripting

Moderators: Tom, Kukurykus

mycort

Extracting Multiple Text Font Color

Post by mycort »

My Friend is trying extract multiple font colors from a single text line and he can't seem to make it work:

He's even tried this code but no luck working:
Key 14 = color: DescValueType.OBJECTTYPE

Code Snippet that is not working:
Code: Select all     try {
                var aColor = "Color: " + styleDesc.getString(stringIDToTypeID('color'));
            } catch (e) {
                var aColor = '';
            };



Full Code:
Code: Select all// get fonts and other parameters used in type layer
function getFonts(textLayer) {

    if (textLayer.kind == LayerKind.TEXT) {

        app.activeDocument.activeLayer = textLayer;
        var ref = new ActionReference();
        ref.putEnumerated(charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt"));
        var layerDesc = executeActionGet(ref);
        var textDesc = layerDesc.getObjectValue(stringIDToTypeID('textKey'));
        var rangeList = textDesc.getList(stringIDToTypeID('textStyleRange'));

        var fonts = [];

        for (var m = 0; m < rangeList.count; m++) {

            var styleDesc = rangeList.getObjectValue(m).getObjectValue(stringIDToTypeID('textStyle'));
            var aFrom = rangeList.getObjectValue(m).getInteger(stringIDToTypeID('from'));
            var aTo = rangeList.getObjectValue(m).getInteger(stringIDToTypeID('to'));
            var theLetters = app.activeDocument.activeLayer.textItem.contents.slice(aFrom, aTo);

            var aFont = "Font: " + styleDesc.getString(stringIDToTypeID('fontPostScriptName'));

            try {
                var aSize = "Size: " + styleDesc.getUnitDoubleValue(stringIDToTypeID('size')) + " " + typeIDToCharID(styleDesc.getUnitDoubleType(stringIDToTypeID('size')));
            } catch (e) {
                var aSize = '';
            };

            try {
                var aColor = "Color: " + styleDesc.getString(stringIDToTypeID('color'));
            } catch (e) {
                var aColor = '';
            };

            var merged = false;

            for (var x = 0; x < m; x++) {
                try {
                    if (fonts[x].font === aFont && fonts[x].size === aSize && fonts[x].color === aColor) {
                        fonts[x].text += "\"" + theLetters.replace(/^\s+/, '').replace(/\s+$/, '') + "\"\r";
                        merged = true;
                    }
                } catch (e) {}
            }

            if (!merged) {
                fonts.push({
                    text: "\"" + theLetters.replace(/^\s+/, '').replace(/\s+$/, '') + "\"\r",
                    font: aFont,
                    size: aSize,
                    color: aColor
                });
            }

        };

        return fonts;

    }
};


Professional AI Audio Generation within Adobe Premiere Pro - Download Free Plugin here

Paul MR

Extracting Multiple Text Font Color

Post by Paul MR »

Please try this...

Code: Select all// get fonts and other parameters used in type layer
function getFonts(textLayer) {

    if (textLayer.kind == LayerKind.TEXT) {

        app.activeDocument.activeLayer = textLayer;
        var ref = new ActionReference();
        ref.putEnumerated(charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt"));
        var layerDesc = executeActionGet(ref);
        var textDesc = layerDesc.getObjectValue(stringIDToTypeID('textKey'));
        var rangeList = textDesc.getList(stringIDToTypeID('textStyleRange'));

        var fonts = [];

        for (var m = 0; m < rangeList.count; m++) {

            var styleDesc = rangeList.getObjectValue(m).getObjectValue(stringIDToTypeID('textStyle'));
            var aFrom = rangeList.getObjectValue(m).getInteger(stringIDToTypeID('from'));
            var aTo = rangeList.getObjectValue(m).getInteger(stringIDToTypeID('to'));
            var theLetters = app.activeDocument.activeLayer.textItem.contents.slice(aFrom, aTo);

            var aFont = "Font: " + styleDesc.getString(stringIDToTypeID('fontPostScriptName'));

            try {
                var aSize = "Size: " + styleDesc.getUnitDoubleValue(stringIDToTypeID('size')) + " " + typeIDToCharID(styleDesc.getUnitDoubleType(stringIDToTypeID('size')));
            } catch (e) {
                var aSize = '';
            };

            try {
                var Colour = new SolidColor;
                Colour.rgb.red = styleDesc.getObjectValue(stringIDToTypeID('color')).getUnitDoubleValue(stringIDToTypeID('red'));
                Colour.rgb.green  = styleDesc.getObjectValue(stringIDToTypeID('color')).getUnitDoubleValue(stringIDToTypeID('grain'));
                Colour.rgb.blue  =  styleDesc.getObjectValue(stringIDToTypeID('color')).getUnitDoubleValue(stringIDToTypeID('blue'));
                var aColor = Colour.rgb.hexValue;
            } catch (e) {
                var aColor = '';
            };

            var merged = false;

            for (var x = 0; x < m; x++) {
                try {
                    if (fonts[x].font === aFont && fonts[x].size === aSize && fonts[x].color === aColor) {
                        fonts[x].text += "\"" + theLetters.replace(/^\s+/, '').replace(/\s+$/, '') + "\"\r";
                        merged = true;
                    }
                } catch (e) {}
            }

            if (!merged) {
                fonts.push({
                    text: "\"" + theLetters.replace(/^\s+/, '').replace(/\s+$/, '') + "\"\r",
                    font: aFont,
                    size: aSize,
                    color: aColor
                });
            }

        };

        return fonts;

    }
};


Mike Hale

Extracting Multiple Text Font Color

Post by Mike Hale »

Another way to extract a SolidColor object from a color descriptor:
Code: Select allvar ref = new ActionReference();
ref.putEnumerated( charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt") );
var desc = executeActionGet(ref).getObjectValue(charIDToTypeID("Txt ")).getList(charIDToTypeID("Txtt")).getObjectValue(0).getObjectValue(charIDToTypeID("TxtS"));

// desc is an ActionDescriptor that contain the "Clr " key
// works with any color mode that supports text layers
var firstRangeColor = getColorFromDescriptor( desc.getObjectValue(charIDToTypeID("Clr ")), typeIDToCharID(desc.getClass(charIDToTypeID("Clr "))));
alert('The RGB.hexValue of the first text range is: '+firstRangeColor.rgb.hexValue);

function getColorFromDescriptor( colorDesc, keyClass ){
   var colorObject = new SolidColor();
   switch( keyClass ){
      case "Grsc":
         colorObject.grey.grey = color.getDouble(charIDToTypeID('Gry '));
         break;
      case "RGBC":
         colorObject.rgb.red = colorDesc.getDouble(charIDToTypeID('Rd  '));
         colorObject.rgb.green = colorDesc.getDouble(charIDToTypeID('Grn '));
         colorObject.rgb.blue = colorDesc.getDouble(charIDToTypeID('Bl  '));
         break;
      case "CMYC":
         colorObject.cmyk.cyan = colorDesc.getDouble(charIDToTypeID('Cyn '));
         colorObject.cmyk.magenta = colorDesc.getDouble(charIDToTypeID('Mgnt'));
         colorObject.cmyk.yellow = colorDesc.getDouble(charIDToTypeID('Ylw '));
         colorObject.cmyk.black = colorDesc.getDouble(charIDToTypeID('Blck'));
         break;
      case "LbCl":
         colorObject.lab.l = colorDesc.getDouble(charIDToTypeID('Lmnc'));
         colorObject.lab.a = colorDesc.getDouble(charIDToTypeID('A   '));
         colorObject.lab.b = colorDesc.getDouble(charIDToTypeID('B   '));
         break;
      default: return null;
   }
   return colorObject;
}

Note that the keys in a color descriptor will be different depending on with color mode the document is in. You can't count on it having a fixed number of keys nor the IDs of the keys.
mycort

Extracting Multiple Text Font Color

Post by mycort »

Awesome, thanks alot for the help and quick response. I'll have him try this out!

THANKS ALOT!!!!