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 {