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;
}
};
Extracting Multiple Text Font Color
-
Paul MR
Extracting Multiple Text Font Color
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;
}
};
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
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.
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
Awesome, thanks alot for the help and quick response. I'll have him try this out!
THANKS ALOT!!!!
THANKS ALOT!!!!