# HG changeset patch # User robcast # Date 1298989071 -3600 # Node ID c07c21ac78f9029227946f0612e1af174eb2462d # Parent 8ee72433bb8f4627b4082d057cd60c5ff6a8c95b color invert operation. doesn't work with all image types yet... diff -r 8ee72433bb8f -r c07c21ac78f9 servlet/src/digilib/image/DocuImage.java --- a/servlet/src/digilib/image/DocuImage.java Tue Mar 01 10:14:29 2011 +0100 +++ b/servlet/src/digilib/image/DocuImage.java Tue Mar 01 15:17:51 2011 +0100 @@ -207,7 +207,7 @@ * * */ - public enum ColorOp {GRAYSCALE}; + public enum ColorOp {GRAYSCALE, INVERT}; /** Changes the colors of the current image. * diff -r 8ee72433bb8f -r c07c21ac78f9 servlet/src/digilib/image/ImageLoaderDocuImage.java --- a/servlet/src/digilib/image/ImageLoaderDocuImage.java Tue Mar 01 10:14:29 2011 +0100 +++ b/servlet/src/digilib/image/ImageLoaderDocuImage.java Tue Mar 01 15:17:51 2011 +0100 @@ -27,9 +27,12 @@ import java.awt.geom.Rectangle2D; import java.awt.image.AffineTransformOp; import java.awt.image.BufferedImage; +import java.awt.image.ByteLookupTable; import java.awt.image.ColorConvertOp; import java.awt.image.ConvolveOp; import java.awt.image.Kernel; +import java.awt.image.LookupOp; +import java.awt.image.LookupTable; import java.awt.image.RescaleOp; import java.io.IOException; import java.io.OutputStream; @@ -62,6 +65,7 @@ /** interpolation type */ protected RenderingHints renderHint; + /** convolution kernels for blur() */ protected static Kernel[] convolutionKernels = { null, new Kernel(1, 1, new float[] {1f}), @@ -69,6 +73,23 @@ new Kernel(3, 3, new float[] {1f/9f, 1f/9f, 1f/9f, 1f/9f, 1f/9f, 1f/9f, 1f/9f, 1f/9f, 1f/9f}) }; + /** lookup table for inverting images (byte) */ + protected static LookupTable invertByteTable; + + static { + byte[] invertByte = new byte[256]; + byte[] orderedByte = new byte[256]; + for (int i = 0; i < 256; ++i) { + invertByte[i] = (byte) (256 - i); + orderedByte[i] = (byte) i; + } + // works for JPEG in q2 + invertByteTable = new ByteLookupTable(0, new byte[][] { + invertByte, invertByte, orderedByte, invertByte}); + // should work... + /* invertByteTable = new ByteLookupTable(0, invertByte); */ + } + /** the size of the current image */ protected ImageSize imageSize; @@ -482,10 +503,18 @@ public void colorOp(ColorOp op) throws ImageOpException { if (op == ColorOp.GRAYSCALE) { // convert image to grayscale + logger.debug("Color op: grayscaling"); ColorConvertOp colop = new ColorConvertOp( ColorSpace.getInstance(ColorSpace.CS_GRAY), null); img = colop.filter(img, null); + } else if (op == ColorOp.INVERT) { + // invert colors i.e. invert every channel + logger.debug("Color op: inverting"); + // TODO: is this enough for all image types? + LookupOp colop = new LookupOp(invertByteTable, renderHint); + img = colop.filter(img, null); } + } public void rotate(double angle) throws ImageOpException { diff -r 8ee72433bb8f -r c07c21ac78f9 servlet/src/digilib/servlet/Scaler.java --- a/servlet/src/digilib/servlet/Scaler.java Tue Mar 01 10:14:29 2011 +0100 +++ b/servlet/src/digilib/servlet/Scaler.java Tue Mar 01 15:17:51 2011 +0100 @@ -31,7 +31,7 @@ private static final long serialVersionUID = 5289386646192471549L; /** digilib servlet version (for all components) */ - public static final String version = "1.9.1a13"; + public static final String version = "1.9.1a14"; /** servlet error codes */ public static enum Error {UNKNOWN, AUTH, FILE, IMAGE};