Hoping for a quick way to reveal faint pixels on a transparent layer. In the example image below, there's a smudge in the upper left that was hard to see in Photoshop.

Ideal Solution

Adding blend modes or adjustments would probably work. But hoping for something a bit more casual, less destructive. Something like Illustrator's outline mode would be ideal. Likewise, Photoshop's isolated view of masks. Both of those methods make it very obvious where pixels are and are not. And since they're view based, they don't require you to undo the adjustment or leave it in by accident.

shadow pass with faint smudge in upper left

4 Answers 4


You can add a "Threshold Adjustment Layer" and set the Threshold Level to 255. All pixels lighter than the threshold are converted to white; and all pixels darker are converted to black. Since we moved the threshold to the right, we made all pixels black. Depending on the layer, you might not be able to view the layer mask selection.

threshold gif


I've made myself a script that adds/removes a magenta outline to the active layer — so every transparent pixel becomes visible — and I have it assigned to F4.

enter image description here

Limitation is that it'll freak out if there are several strokes already on the layer or remove an existing stroke effect.

To use it save this to a name.jsx to your Photoshop/Presets/Scripts folder, restart PS and you'll find name in the File > Scripts menu. And it's possible to assign a shortcut to it via Edit > Edit Keyboard Shortcuts menu.

function main() {

    if ( checkIfHasStrokeFX() ) {
    } else {
            width: 1, // width of the stroke
            color: [255, 0, 255] // color in r, g, b

    function checkIfHasStrokeFX(_data) {
        if (_data == void(0)) _data = {};
        try {
            var ref = new ActionReference();
            ref.putProperty(charIDToTypeID("Prpr"), charIDToTypeID("Lefx"));
            ref.putEnumerated(charIDToTypeID('Lyr '), charIDToTypeID('Ordn'), charIDToTypeID('Trgt'));
            try {
              var desc = executeActionGet(ref)
              var tempBool = false;
              for (var i = 0; i < desc.count; i++) {
                if (desc.getObjectValue(i).getBoolean(charIDToTypeID("enab"))) tempBool = true;
              desc = tempBool
            } catch (e) {
              var desc = executeActionGet(ref)
            return desc
        } catch (e) {
            return false

    function addStroke(_data) {
        if (_data == void(0)) _data = {};
        if (_data.color == void(0)) _data.color = [255, 0, 255];
        if (_data.opacity == void(0)) _data.opacity = 100;
        if (_data.width == void(0)) _data.width = 1;
        if (_data.position == void(0)) _data.position = 'OutF'; 
        var desc16 = new ActionDescriptor();
        var ref3 = new ActionReference();
        ref3.putProperty(charIDToTypeID('Prpr'), charIDToTypeID('Lefx'));
        ref3.putEnumerated(charIDToTypeID('Lyr '), charIDToTypeID('Ordn'), charIDToTypeID('Trgt'));
        desc16.putReference(charIDToTypeID('null'), ref3);
        var desc17 = new ActionDescriptor();
        desc17.putUnitDouble(charIDToTypeID('Scl '), charIDToTypeID('#Prc'), 100.000000);
        var desc18 = new ActionDescriptor();
        desc18.putBoolean(charIDToTypeID('enab'), true);
        desc18.putBoolean(stringIDToTypeID('present'), true);
        desc18.putBoolean(stringIDToTypeID('showInDialog'), true);
        desc18.putEnumerated(charIDToTypeID('Styl'), charIDToTypeID('FStl'), charIDToTypeID('OutF'));
        desc18.putEnumerated(charIDToTypeID('PntT'), charIDToTypeID('FrFl'), charIDToTypeID('SClr'));
        desc18.putEnumerated(charIDToTypeID('Md  '), charIDToTypeID('BlnM'), charIDToTypeID('Nrml'));
        desc18.putUnitDouble(charIDToTypeID('Opct'), charIDToTypeID('#Prc'), _data.opacity);
        desc18.putUnitDouble(charIDToTypeID('Sz  '), charIDToTypeID('#Pxl'), _data.width);
        var desc19 = new ActionDescriptor();
        desc19.putDouble(charIDToTypeID('Rd  '), _data.color[0]);
        desc19.putDouble(charIDToTypeID('Grn '), _data.color[1]);
        desc19.putDouble(charIDToTypeID('Bl  '), _data.color[2]);
        desc18.putObject(charIDToTypeID('Clr '), charIDToTypeID('RGBC'), desc19);
        desc18.putBoolean(stringIDToTypeID('overprint'), false);
        desc17.putObject(charIDToTypeID('FrFX'), charIDToTypeID('FrFX'), desc18);
        desc16.putObject(charIDToTypeID('T   '), charIDToTypeID('Lefx'), desc17);
        executeAction(charIDToTypeID('setd'), desc16, DialogModes.NO);

    function removeFX(_data) {
        if (_data == void(0)) _data = {};
        if (_data.all == void(0)) _data.all = false;
        try {
            var desc20 = new ActionDescriptor();
            var ref4 = new ActionReference();
            _data.all || ref4.putIndex(charIDToTypeID('FrFX'), 3);
            ref4.putEnumerated(charIDToTypeID('Lyr '), charIDToTypeID('Ordn'), charIDToTypeID('Trgt'));
            desc20.putReference(charIDToTypeID('null'), ref4);
            executeAction(charIDToTypeID(_data.all ? 'dlfx' : 'dsfx'), desc20, DialogModes.NO);
            return true
        } catch (e) {
            return false;

app.activeDocument.suspendHistory("check if has FX", "main()");
  • Confirming this solution works. It has the benefit of being quick to undo.
    – Zollie
    Jun 30, 2020 at 16:34
  • @Zollie Well, you can undo or you can run the script again. I accepted your edits because they remove some comments however personally I prefer 'brackets on new lines'. And if this works for you please don't forget to accept the answer. Cheers Jun 30, 2020 at 18:09
  • Ah, sorry for the trouble with the code formatting. These are great solutions. Just giving time in case other ideas come up. Thanks again
    – Zollie
    Jun 30, 2020 at 20:49

Old trick....

Layer Style Stroke

Just add a Stroke Layer Style to the layer. Areas will immediately become visible.

enter image description here

To see some semi-transparent areas it can be helpful to add a temporary working layer that is a solid color fill, white or black, below the layer in question.

enter image description here

You can then mask or delete the areas as necessary and merely remove the layer style and temporary fill layer.

enter image description here


If you are not forced to stick with Photoshop goto GIMP and adjust the alpha channel in every pixel to 255 with Color > Curves:

enter image description here

Changing alpha to 255 keeps RGB values but removes all transparency. This works if the image has RGB color mode with alpha channel and the faint look is caused by the transparency.

This is useless if the RGB values are removed due 100% transparency. That happens in many programs automatically to save the space - fully transparent areas lose all color and brightness data. In that case maybe a better result can be got by applying a curve which keeps fully transparent areas transparent but decreases the transparency with a steep curve:

enter image description here

There's a white background layer inserted. Unfortunately it hides white, so try also a darker background layer.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.