/******************************************************************** * * PhotoGrok Script * * Draw a histogram and show highlights/shadow areas. * * Very slow on Java 6 and 7 - especially on Apple's old Java 6 JVM. * Quite speedy on Java 8 and above (6 seconds vs 30ms on my machine). * * Histogram heavily inspired/borrowed from Bill Mill's article found * here: http://billmill.org/the_histogram.html * * **********************************************************************/ // syntax for rhino compatibility var red = new Color['(int,int,int,int)'](255,0,0,100); var green = new Color['(int,int,int,int)'](0,255,0,100); var blue = new Color['(int,int,int,int)'](0,0,255,100); var name = ''; var max = 0; var rvals, gvals, bvals; function array256(default_value) { arr = []; for (var i=0; i<256; i++) { arr[i] = default_value; } return arr; } // register a painter function setPainter(function(gfx, image, ig, pp){ if(pp.dragging || pp.zooming || pp.resizing) return; if(image != null){ // use file name to determine if new image (optimization) var newImage = pp.file != name; name = pp.file; if(newImage){ rvals = array256(0); gvals = array256(0); bvals = array256(0); } for(var i = 0; i < image.getWidth(); i++){ for(var j = 0; j < image.getHeight(); j++){ var pixel = image.getRGB(i,j); var b = (pixel) & 0xff; var g = (pixel >> 8) & 0xff; var r = (pixel >> 16) & 0xff; if(newImage){ rvals[r]++; gvals[g]++; bvals[b]++; } // draw highlights gfx.setColor(Color.RED); if(r > 250 && g > 250 && b > 250){ gfx.drawLine(i + pp.imageX, j + pp.imageY, i + pp.imageX, j + pp.imageY); } // draw shadows gfx.setColor(Color.BLUE); if(r < 5 && g < 5 && b < 5){ gfx.drawLine(i + pp.imageX, j + pp.imageY, i + pp.imageX, j + pp.imageY); } } } if(newImage){ var redMax = Math.max.apply(null, rvals); var gMax = Math.max.apply(null, gvals); var bMax = Math.max.apply(null, bvals); max = Math.max(redMax, gMax, bMax); } // draw histogram box gfx.setColor(Color.YELLOW); var offX = 10; gfx.drawRect(offX, 6, 258, 102); // draw histogram histogram(gfx, red, rvals, offX, 6, max); histogram(gfx, green, gvals, offX, 6, max); histogram(gfx, blue, bvals, offX, 6, max); // show file name on screen gfx.setColor(Color.RED); gfx.drawString(pp.file, 20, 30); // show ElapsedTime on screen - for efficiency, use getTagValue // when not in full screen mode if(pp.fullScreen){ var ex = getExifData(pp.dir, pp.file); for(var i = 0; i < ex.length; i++){ if(ex[i].startsWith("ElapsedTime")){ gfx.drawString(ex[i].substring(13), 20, 50); break; } } }else{ var et = getTagValue("ElapsedTime"); if(et != null) gfx.drawString(et, 20, 50); } } }); function histogram(gfx, color, vals, offX, offY, max){ gfx.setColor(color); for(var c = 0; c < 256; c++){ var pct = (vals[c] / max) * 100; var pt = 101 - Math.round(pct); gfx.drawRect(c + 1 + offX, offY + pt, 1, Math.round(pct)); } }