1 18 package org.apache.batik.extension.svg; 19 20 import java.awt.geom.AffineTransform ; 21 import java.awt.image.RenderedImage ; 22 import java.awt.image.SampleModel ; 23 import java.awt.image.renderable.RenderContext ; 24 25 import org.apache.batik.ext.awt.image.LinearTransfer; 26 import org.apache.batik.ext.awt.image.TransferFunction; 27 import org.apache.batik.ext.awt.image.renderable.AbstractColorInterpolationRable; 28 import org.apache.batik.ext.awt.image.renderable.Filter; 29 import org.apache.batik.ext.awt.image.rendered.ComponentTransferRed; 30 31 public class BatikHistogramNormalizationFilter8Bit 32 extends AbstractColorInterpolationRable 33 implements BatikHistogramNormalizationFilter { 34 35 private float trim = .01f; 36 37 40 public void setSource(Filter src){ 41 init(src, null); 42 } 43 44 47 public Filter getSource(){ 48 return (Filter)getSources().get(0); 49 } 50 51 54 public float getTrim() { 55 return trim; 56 } 57 58 61 public void setTrim(float trim) { 62 this.trim = trim; 63 touch(); 64 } 65 66 public BatikHistogramNormalizationFilter8Bit(Filter src, float trim) { 67 setSource(src); 68 setTrim(trim); 69 } 70 71 protected int [] histo = null; 72 protected float slope, intercept; 73 74 81 public void computeHistogram(RenderContext rc) { 82 if (histo != null) 83 return; 84 85 Filter src = getSource(); 86 87 float scale = 100f/src.getWidth(); 88 float yscale = 100f/src.getHeight(); 89 90 if (scale > yscale) scale=yscale; 91 92 AffineTransform at = AffineTransform.getScaleInstance(scale, scale); 93 rc = new RenderContext (at, rc.getRenderingHints()); 94 RenderedImage histRI = getSource().createRendering(rc); 95 96 histo = new HistogramRed(convertSourceCS(histRI)).getHistogram(); 97 98 int t = (int)(histRI.getWidth()*histRI.getHeight()*trim+0.5); 99 int c, i; 100 for (c=0, i=0; i<255; i++) { 101 c+=histo[i]; 102 if (c>=t) break; 104 } 105 int low = i; 106 107 for (c=0, i=255; i>0; i--) { 108 c+=histo[i]; 109 if (c>=t) break; 111 } 112 int hi = i; 113 114 slope = 255f/(hi-low); 115 intercept = (slope*-low)/255f; 116 } 117 118 119 public RenderedImage createRendering(RenderContext rc) { 120 RenderedImage srcRI = getSource().createRendering(rc); 124 125 if(srcRI == null) 126 return null; 127 128 computeHistogram(rc); 129 130 SampleModel sm = srcRI.getSampleModel(); 131 int bands = sm.getNumBands(); 132 133 TransferFunction [] tfs = new TransferFunction[bands]; 135 TransferFunction tf = new LinearTransfer(slope, intercept); 136 for (int i=0; i<tfs.length; i++) 137 tfs[i] = tf; 138 139 return new ComponentTransferRed(convertSourceCS(srcRI), tfs, null); 140 } 141 } 142 | Popular Tags |