Skip to main content
Participant
July 21, 2010
Question

Retriving different histograms from activeDocument

  • July 21, 2010
  • 1 reply
  • 3619 views

Hi

In CS4 & CS5 on the histogram menu it's possible to select different  types of histograms

from the channel drop box.

I can select RGB, R,G,B, Colors and luminosity.

However when I execute a DoJavaScipt on the active document I can only get

the luminosity or specific R, G, B histograms based on the activeChannels  container.

How can I get the RGB or Colors histogram (I know I can sum up all the  different channels (R,G,B)

but it seems stupid since the RGB data and color is already presented.

Do I need to write a plug-in to extract this data for me?

Thanks

This topic has been closed for replies.

1 reply

JJMack
Community Expert
Community Expert
July 21, 2010

I do not know javascript or photoshop scripting I only hack at code i steal from script I download. In the Photoshop CS5 Java scripting there seems to be a sample script names Histogram.jsx it get all four channels I never understood what Adobe fifth Colors was about. it looks like this

// Function to activate all the channels according to the documents mode

// Takes a document reference for input

function TurnOnDocumentHistogramChannels(inDocument) {

    // see how many channels we need to activate

    var visibleChannelCount = 0

    // based on the mode of the document

    switch (inDocument.mode) {

        case DocumentMode.BITMAP:

        case DocumentMode.GRAYSCALE:

        case DocumentMode.INDEXEDCOLOR:

            visibleChannelCount = 1

            break;

        case DocumentMode.DUOTONE:

            visibleChannelCount = 2

            break;

        case DocumentMode.RGB:

        case DocumentMode.LAB:

            visibleChannelCount = 3

            break;

        case DocumentMode.CMYK:

            visibleChannelCount = 4

            break;

        case DocumentMode.MULTICHANNEL:

            default:

            visibleChannelCount = inDocument.channels.length + 1

            break;

    }

    // now get the channels to activate into a local array

    var aChannelArray = new Array()

    // index for the active channels array

    var aChannelIndex = 0

    for(var channelIndex = 0; channelIndex < inDocument.channels.length;

            channelIndex++) {

        if (channelIndex < visibleChannelCount) {

            aChannelArray[aChannelIndex++] = inDocument.channels[channelIndex]

        }

    }

    // now activate them

    inDocument.activeChannels = aChannelArray

}

// Save the current preferences

var startRulerUnits = app.preferences.rulerUnits

var startTypeUnits = app.preferences.typeUnits

var startDisplayDialogs = app.displayDialogs

// Set Adobe Photoshop CS5 to use pixels and display no dialogs

app.preferences.rulerUnits = Units.PIXELS

app.preferences.typeUnits = TypeUnits.PIXELS

app.displayDialogs = DialogModes.NO

// if there are no documents open then try to open a sample file

if (app.documents.length == 0) {

    open(File(app.path + "/Samples/Fish.psd"))

}

// get a reference to the working document

var docRef = app.activeDocument

// create the output file

// first figure out which kind of line feeds we need

if ($.os.search(/windows/i) != -1) {

    fileLineFeed = "Windows"

} else {

    fileLineFeed = "Macintosh"

}

// create the output file accordingly

fileOut = new File("~/Desktop/Histogram.log")

fileOut.lineFeed = fileLineFeed

fileOut.open("w", "TEXT", "????")

// write out a header

fileOut.write("Histogram report for " + docRef.name)

// find out how many pixels I have

var totalCount = docRef.width.value * docRef.height.value

// more info to the out file

fileOut.write(" with a total pixel count of " + totalCount + "\n")

// channel indexer

var channelIndex = 0

// remember which channels are currently active

var myActiveChannels = app.activeDocument.activeChannels

// document histogram only works in these modes

if (docRef.mode == DocumentMode.RGB ||

    docRef.mode == DocumentMode.INDEXEDCOLOR ||

    docRef.mode == DocumentMode.CMYK) {

    // activate the main channels so we can get the documents histogram

    TurnOnDocumentHistogramChannels(docRef)

    // Output the documents histogram

    OutputHistogram(docRef.histogram, "Luminosity", fileOut)

}

// local reference to work from

var myChannels = docRef.channels

// loop through each channel and output the histogram

for (var channelIndex = 0; channelIndex < myChannels.length; channelIndex++) {

    // the channel has to be visible to get a histogram

    myChannels[channelIndex].visible= true

    // turn off all the other channels

    for (var secondaryIndex = 0; secondaryIndex < myChannels.length;

            secondaryIndex++) {

        if (channelIndex != secondaryIndex) {

            myChannels[secondaryIndex].visible= false

        }

    }

// Use the function to dump the histogram

OutputHistogram(myChannels[channelIndex].histogram,

    myChannels[channelIndex].name, fileOut)

}

// close down the output file

fileOut.close()

alert("Histogram file saved to: " + fileOut.fsName)

// reset the active channels

docRef.activeChannels = myActiveChannels

// Reset the application preferences

app.preferences.rulerUnits = startRulerUnits

app.preferences.typeUnits = startTypeUnits

app.displayDialogs = startDisplayDialogs

// Utility function that takes a histogram and name

// and dumps to the output file

function OutputHistogram(inHistogram, inHistogramName, inOutFile) {

    // find ouch which count has the largest number

    // I scale everything to this number for the output

    var largestCount = 0

    // a simple indexer I can reuse

    var histogramIndex = 0

    // see how many samples we have total

    var histogramCount = 0

    // search through all and find the largest single item

    for (histogramIndex = 0; histogramIndex < inHistogram.length;

            histogramIndex++) {

        histogramCount += inHistogram[histogramIndex]

        if (inHistogram[histogramIndex] > largestCount)

            largestCount = inHistogram[histogramIndex]

    }

    // These should match

    if (histogramCount != totalCount) {

        alert("Something bad is happening!")

    }

    // see how much each "X" is going to count as

    var pixelsPerX = largestCount / 100

    // output this data to the file

    inOutFile.write("One X = " + pixelsPerX + " pixels.\n")

    // output the name of this histogram

    inOutFile.write(inHistogramName + "\n")

    // loop through all the items and output in the following format

    // 001

    // 002

    for (histogramIndex = 0; histogramIndex < inHistogram.length;

            histogramIndex++) {

    // I need an extra "0" for this line item to keep everything in line

    if (histogramIndex < 10)

        inOutFile.write("0")

    // I need an extra "0" for this line item to keep everything in line

    if (histogramIndex < 100)

        inOutFile.write("0")

    // output the index to file

    inOutFile.write(histogramIndex)

    // some spacing to make it look nice

    inOutFile.write(" ")

    // figure out how many X’s I need

    var outputX = inHistogram[histogramIndex] / largestCount * 100

    // output the X’s

    for (var a = 0; a < outputX; a++)

        inOutFile.write("X")

    inOutFile.write("\n")

    }

    inOutFile.write("\n")

}

JJMack
yairTechnAuthor
Participant
July 22, 2010

Thanks but I already have the code you've posted its from the script manuals for CS4 ac CS5

as you can see by looking the word "Luminosity" the output of the  histogram

is that of Luminosity and not of the RGB(compound) or Color (RGB  intersections)


The amazing thing is that all of the histogram data is already on the  Histogram

but you can't get access to the compound RGB or Color channels.


if there was a way to get these compound channels histogram data

then It would do he trick.



michal-44680644
Participating Frequently
December 11, 2017

try:

alert('histogram RGB:'+app.activeDocument.histogram);