Copy link to clipboard
Copied
Duplicate the target layer. Filter > Blur > Average. Change to Difference blend mode. Check the histogram for the mean or median value that is not equal to zero. Remove the dupe layer.
/*
Check If Active Layer Is a Flat Color.jsx
v1.0, 22nd May 2023 - Stephen Marsh
https://community.adobe.com/t5/photoshop-ecosystem-discussions/how-do-i-tell-if-
...
Copy link to clipboard
Copied
Try the various scripts in the following topic thread:
Copy link to clipboard
Copied
Thank you very much for your answer. Maybe my title is wrong. I mean to judge whether the current layer is a pure color layer
Copy link to clipboard
Copied
Thank you very much for your answer. Maybe my title is wrong. I mean to judge whether the current layer is a pure color layer
By @meadX
Ah, well that is different.
Will sampling the four corners and the centre be accurate enough?
What about the histogram? The rounded RGB Luminosity mean value should equal the rounded median value. You could also compare the separate R, G and B rounded mean vs. rounded median values, or work in a copy in Lab colour mode only comparing the L channel value etc.
P.S. I am only "brainstorming" ideas, I'm not the guy to write the code!
Copy link to clipboard
Copied
Duplicate the target layer. Filter > Blur > Average. Change to Difference blend mode. Check the histogram for the mean or median value that is not equal to zero. Remove the dupe layer.
/*
Check If Active Layer Is a Flat Color.jsx
v1.0, 22nd May 2023 - Stephen Marsh
https://community.adobe.com/t5/photoshop-ecosystem-discussions/how-do-i-tell-if-a-layer-is-solid/td-p/13806717
Special thanks to SuperMerlin for the Histogram Mean value code:
https://community.adobe.com/t5/photoshop-ecosystem-discussions/smart-exposure-compensation-script/m-p/11092968
*/
#target photoshop
if (app.documents.length > 0) {
// Selected layer check by jazz-y
s2t = stringIDToTypeID;
(r = new ActionReference()).putProperty(s2t('property'), p = s2t('targetLayers'));
r.putEnumerated(s2t("document"), s2t("ordinal"), s2t("targetEnum"));
if (executeActionGet(r).getList(p).count) {
function main() {
dupeLayer("_Temp_Diff-Check");
activeDocument.activeLayer.blendMode = BlendMode.DIFFERENCE;
Avrg();
var mean = meanHist(activeDocument.histogram).toFixed(0);
if (mean != 0) {
var notFlat = "The layer isn't a flat color!";
alert(notFlat);
} else {
var isFlat = "The layer is a flat color!";
alert(isFlat);
}
if (activeDocument.activeLayer.name = "_Temp_Diff-Check") {
activeDocument.activeLayer.remove();
}
}
app.activeDocument.suspendHistory("Flat color check", "main()");
} else {
alert('A layer must be selected!');
}
} else {
alert('You must have a document open!');
}
function meanHist(hist) {
var acc = 0;
var cnt = 0;
for (var i = 0; i < hist.length; i++) {
acc += i * hist[i];
cnt += hist[i];
}
return acc / cnt;
}
function dupeLayer(layName) {
var s2t = function (s) {
return app.stringIDToTypeID(s);
};
var descriptor = new ActionDescriptor();
var list = new ActionList();
var reference = new ActionReference();
reference.putEnumerated(s2t("layer"), s2t("ordinal"), s2t("targetEnum"));
descriptor.putReference(s2t("null"), reference);
descriptor.putString(s2t("name"), layName);
descriptor.putInteger(s2t("version"), 5);
list.putInteger(6);
descriptor.putList(s2t("ID"), list);
executeAction(s2t("duplicate"), descriptor, DialogModes.NO);
}
function Avrg() {
var c2t = function (s) {
return app.charIDToTypeID(s);
};
executeAction(c2t("Avrg"), undefined, DialogModes.NO);
}
Copy link to clipboard
Copied
Thank you for your help, I also achieved it through one of the most cumbersome methods
var doc = app.activeDocument;var layer = doc.activeLayer;var bounds = layer.bounds;var topLeftCorner = { x: bounds[0].value, y: bounds[1].value};var topRightCorner = { x: bounds[2].value, y: bounds[1].value};var bottomLeftCorner = { x: bounds[0].value, y: bounds[3].value};var bottomRightCorner = { x: bounds[2].value, y: bounds[3].value};var x1 = 1;var y1 = 1;var rgb1 = getRGB(x1, y1);var x2 = bottomRightCorner.x.toFixed() - 1var y2 = bottomRightCorner.y.toFixed() - 1var rgb2 = getRGB(x2, y2);var x3 = 1;var y3 = bottomLeftCorner.y.toFixed() - 1var rgb3 = getRGB(x3, y3);var x4 = bottomRightCorner.x.toFixed() - 1var y4 = 1;var rgb4 = getRGB(x4, y4);var ifrgb1 = rgb1.join("-");var ifrgb2 = rgb2.join("-");var ifrgb3 = rgb3.join("-");var ifrgb4 = rgb4.join("-");if (ifrgb1 === ifrgb2 && ifrgb1 === ifrgb3 && ifrgb1 === ifrgb4 && ifrgb2 === ifrgb3 && ifrgb3 === ifrgb4) { alert("pure color");} else { alert("Is not a pure color");}function getRGB(x, y) { var pointSample = app.activeDocument.colorSamplers.add([(x - 1), (y - 1)]); var rgb = [ pointSample.color.rgb.red, pointSample.color.rgb.green, pointSample.color.rgb.blue ]; var d = new ActionDescriptor(); var r = new ActionReference(); r.putEnumerated(stringIDToTypeID("colorSampler"), stringIDToTypeID("ordinal"), stringIDToTypeID("allEnum")); d.putReference(stringIDToTypeID("null"), r); executeAction(stringIDToTypeID("delete"), d, DialogModes.NO); return rgb;}
Copy link to clipboard
Copied
Great stuff!
It will really come down to the images in question as to how robust the solution should be.