Mercurial > hg > digilib-old
comparison servlet/src/digilib/image/JAIDocuImage.java @ 142:f52a7664a807
Servlet version 1.12b3
- JAIImageLoaderDocuImage working again
- smoother scaling with JAI and JAIImageLoader
- Quality default now 1
author | robcast |
---|---|
date | Mon, 18 Aug 2003 11:38:15 +0200 |
parents | 78f52a1876fe |
children | d87a7e2515af |
comparison
equal
deleted
inserted
replaced
141:8b327d506968 | 142:f52a7664a807 |
---|---|
25 import java.awt.image.renderable.ParameterBlock; | 25 import java.awt.image.renderable.ParameterBlock; |
26 import java.io.File; | 26 import java.io.File; |
27 import java.io.IOException; | 27 import java.io.IOException; |
28 import java.io.OutputStream; | 28 import java.io.OutputStream; |
29 | 29 |
30 import javax.media.jai.*; | 30 import javax.media.jai.BorderExtender; |
31 import javax.media.jai.Interpolation; | |
32 import javax.media.jai.JAI; | |
33 import javax.media.jai.KernelJAI; | |
34 import javax.media.jai.ParameterBlockJAI; | |
31 import javax.media.jai.operator.TransposeDescriptor; | 35 import javax.media.jai.operator.TransposeDescriptor; |
32 import javax.media.jai.operator.TransposeType; | 36 import javax.media.jai.operator.TransposeType; |
33 | 37 |
34 import digilib.Utils; | 38 import digilib.Utils; |
35 import digilib.io.FileOpException; | 39 import digilib.io.FileOpException; |
124 return 0; | 128 return 0; |
125 } | 129 } |
126 | 130 |
127 /* scales the current image */ | 131 /* scales the current image */ |
128 public void scale(double scale) throws ImageOpException { | 132 public void scale(double scale) throws ImageOpException { |
129 float sf = (float) scale; | 133 RenderedImage scaledImg = null; |
130 // setup scale | 134 if ((scale < 1) |
131 ParameterBlock param = new ParameterBlock(); | 135 && (img.getColorModel().getPixelSize() == 1) |
132 param.addSource(img); | 136 && (quality > 0)) { |
133 param.add(sf); | 137 /* |
134 param.add(sf); | 138 * "SubsampleBinaryToGray" for downscaling BW |
135 param.add(0f); | 139 */ |
136 param.add(0f); | 140 scaledImg = scaleBinary((float) scale, img); |
137 param.add(interpol); | 141 } else if ((scale <= 0.5) && (quality > 1)) { |
138 // hint with border extender | 142 /* |
139 RenderingHints hint = | 143 * blur and "Scale" for downscaling color images |
140 new RenderingHints( | 144 */ |
141 JAI.KEY_BORDER_EXTENDER, | 145 int subsample = (int) Math.floor(1 / scale); |
142 BorderExtender.createInstance(BorderExtender.BORDER_COPY)); | 146 RenderedImage prescaledImg = img; |
143 | 147 prescaledImg = blur(subsample, img); |
144 RenderedImage scaledImg = JAI.create("scale", param, hint); | 148 scaledImg = scaleAll((float) scale, prescaledImg); |
149 } else { | |
150 /* | |
151 * "Scale" for the rest | |
152 */ | |
153 scaledImg = scaleAll((float) scale, img); | |
154 } | |
145 | 155 |
146 //DEBUG | 156 //DEBUG |
147 util.dprintln( | 157 util.dprintln( |
148 3, | 158 3, |
149 "SCALE: " | 159 "SCALE: " |
156 if (scaledImg == null) { | 166 if (scaledImg == null) { |
157 util.dprintln(2, "ERROR(scale): error in scale"); | 167 util.dprintln(2, "ERROR(scale): error in scale"); |
158 throw new ImageOpException("Unable to scale"); | 168 throw new ImageOpException("Unable to scale"); |
159 } | 169 } |
160 img = scaledImg; | 170 img = scaledImg; |
171 } | |
172 | |
173 private RenderedImage scaleAll(float scale, RenderedImage image) { | |
174 RenderedImage scaledImg; | |
175 //DEBUG | |
176 util.dprintln(4, "scaleAll: " + scale); | |
177 ParameterBlockJAI param = new ParameterBlockJAI("Scale"); | |
178 param.addSource(image); | |
179 param.setParameter("xScale", scale); | |
180 param.setParameter("yScale", scale); | |
181 param.setParameter("interpolation", interpol); | |
182 // hint with border extender | |
183 RenderingHints hint = | |
184 new RenderingHints( | |
185 JAI.KEY_BORDER_EXTENDER, | |
186 BorderExtender.createInstance(BorderExtender.BORDER_COPY)); | |
187 // scale | |
188 scaledImg = JAI.create("Scale", param, hint); | |
189 return scaledImg; | |
190 } | |
191 | |
192 private RenderedImage blur(int radius, RenderedImage image) { | |
193 RenderedImage blurredImg; | |
194 //DEBUG | |
195 util.dprintln(4, "blur: " + radius); | |
196 int klen = Math.max(radius, 2); | |
197 int ksize = klen * klen; | |
198 float f = 1f / ksize; | |
199 float[] kern = new float[ksize]; | |
200 for (int i = 0; i < ksize; i++) { | |
201 kern[i] = f; | |
202 } | |
203 KernelJAI blur = new KernelJAI(klen, klen, kern); | |
204 ParameterBlockJAI param = new ParameterBlockJAI("Convolve"); | |
205 param.addSource(image); | |
206 param.setParameter("kernel", blur); | |
207 // hint with border extender | |
208 RenderingHints hint = | |
209 new RenderingHints( | |
210 JAI.KEY_BORDER_EXTENDER, | |
211 BorderExtender.createInstance(BorderExtender.BORDER_COPY)); | |
212 blurredImg = JAI.create("Convolve", param, hint); | |
213 return blurredImg; | |
214 } | |
215 | |
216 RenderedImage scaleBinary(float scale, RenderedImage image) { | |
217 RenderedImage scaledImg; | |
218 //DEBUG | |
219 util.dprintln(4, "scaleBinary: " + scale); | |
220 ParameterBlockJAI param = | |
221 new ParameterBlockJAI("SubsampleBinaryToGray"); | |
222 param.addSource(image); | |
223 param.setParameter("xScale", scale); | |
224 param.setParameter("yScale", scale); | |
225 // hint with border extender | |
226 RenderingHints hint = | |
227 new RenderingHints( | |
228 JAI.KEY_BORDER_EXTENDER, | |
229 BorderExtender.createInstance(BorderExtender.BORDER_COPY)); | |
230 // scale | |
231 scaledImg = JAI.create("SubsampleBinaryToGray", param, hint); | |
232 return scaledImg; | |
161 } | 233 } |
162 | 234 |
163 /* crops the current image */ | 235 /* crops the current image */ |
164 public void crop(int x_off, int y_off, int width, int height) | 236 public void crop(int x_off, int y_off, int width, int height) |
165 throws ImageOpException { | 237 throws ImageOpException { |