annotate servlet/src/digilib/image/ImageLoaderDocuImage.java @ 71:d493563ef672

New servlet version 1.5b. Mostly cleanup. Global parameters for digilib now in DigilibConfiguration, per request parameters are now all in DigilibRequest. The DocuImage implementation can be selected by the configuration docuimage-class. Pixel-by-pixel view implemented with "mo=clip".
author robcast
date Fri, 24 Jan 2003 21:40:59 +0100
parents 0ff3ede32060
children 3b8797fc3e90 5d0c0da080ec 6d2032b6121d 9cedd170b581
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
1 /* ImageLoaderDocuImage -- Image class implementation using JDK 1.4 ImageLoader
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
2
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
3 Digital Image Library servlet components
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
4
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
5 Copyright (C) 2001, 2002 Robert Casties (robcast@mail.berlios.de)
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
6
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
7 This program is free software; you can redistribute it and/or modify it
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
8 under the terms of the GNU General Public License as published by the
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
9 Free Software Foundation; either version 2 of the License, or (at your
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
10 option) any later version.
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
11
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
12 Please read license.txt for the full details. A copy of the GPL
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
13 may be found at http://www.gnu.org/copyleft/lgpl.html
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
14
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
15 You should have received a copy of the GNU General Public License
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
16 along with this program; if not, write to the Free Software
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
18
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
19 */
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
20
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
21 package digilib.image;
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
22
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
23 import javax.servlet.*;
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
24 import javax.servlet.http.*;
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
25 import java.io.*;
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
26 import java.util.*;
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
27
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
28 import java.awt.*;
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
29 import java.awt.image.*;
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
30 import java.awt.geom.*;
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
31 import java.awt.image.renderable.*;
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
32
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
33 import javax.imageio.*;
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
34
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
35 import digilib.*;
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
36 import digilib.io.*;
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
37
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
38 public class ImageLoaderDocuImage extends DocuImageImpl {
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
39
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
40 private BufferedImage img;
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
41
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
42 public ImageLoaderDocuImage() {
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
43 }
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
44
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
45 public ImageLoaderDocuImage(Utils u) {
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
46 util = u;
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
47 }
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
48
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
49 /**
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
50 * load image file
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
51 */
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
52 public void loadImage(File f) throws FileOpException {
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
53 util.dprintln(10, "loadImage!");
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
54 System.gc();
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
55 try {
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
56 for (int i = 0; i < ImageIO.getReaderFormatNames().length; i++) {
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
57 System.out.println("ImageLoader reader:"+ImageIO.getReaderFormatNames()[i]);
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
58 }
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
59 for (int i = 0; i < ImageIO.getWriterFormatNames().length; i++) {
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
60 System.out.println("ImageLoader writer:"+ImageIO.getWriterFormatNames()[i]);
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
61 }
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
62 img = ImageIO.read(f);
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
63 if (img == null) {
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
64 util.dprintln(3, "ERROR(loadImage): unable to load file");
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
65 throw new FileOpException("Unable to load File!");
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
66 }
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
67 }
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
68 catch (IOException e) {
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
69 throw new FileOpException("Error reading image.");
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
70 }
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
71 }
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
72
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
73 /**
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
74 * write image of type mt to Stream
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
75 */
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
76 public void writeImage(String mt, ServletResponse res)
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
77 throws FileOpException {
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
78 util.dprintln(10, "writeImage!");
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
79 try {
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
80 // setup output
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
81 String type = "png";
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
82 if (mt == "image/jpeg") {
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
83 type = "jpeg";
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
84 } else if (mt == "image/png") {
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
85 type = "png";
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
86 } else {
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
87 // unknown mime type
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
88 util.dprintln(2, "ERROR(writeImage): Unknown mime type "+mt);
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
89 throw new FileOpException("Unknown mime type: "+mt);
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
90 }
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
91 res.setContentType(mt);
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
92 // render output
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
93 if (ImageIO.write(img, type, res.getOutputStream())) {
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
94 // writing was OK
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
95 return;
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
96 } else {
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
97 throw new FileOpException("Error writing image: Unknown image format!");
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
98 }
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
99 } catch (IOException e) {
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
100 // e.printStackTrace();
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
101 throw new FileOpException("Error writing image.");
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
102 }
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
103 }
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
104
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
105 public int getWidth() {
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
106 if (img != null) {
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
107 return img.getWidth();
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
108 }
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
109 return 0;
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
110 }
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
111
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
112 public int getHeight() {
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
113 if (img != null) {
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
114 return img.getHeight();
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
115 }
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
116 return 0;
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
117 }
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
118
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
119 /**
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
120 * crop and scale image
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
121 * take rectangle width,height at position x_off,y_off
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
122 * and scale by scale
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
123 */
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
124 public void cropAndScale(int x_off, int y_off, int width, int height,
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
125 float scale, int qual) throws ImageOpException {
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
126 util.dprintln(10, "cropAndScale!");
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
127
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
128 int scaleInt = 0;
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
129 // setup interpolation quality
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
130 if (qual > 0) {
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
131 util.dprintln(4, "quality q1");
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
132 scaleInt = AffineTransformOp.TYPE_BILINEAR;
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
133 } else {
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
134 util.dprintln(4, "quality q0");
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
135 scaleInt = AffineTransformOp.TYPE_NEAREST_NEIGHBOR;
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
136 }
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
137
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
138 // setup Crop
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
139 BufferedImage croppedImg = img.getSubimage(x_off, y_off, width, height);
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
140
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
141 img = null; // free img
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
142 util.dprintln(3, "CROP:"+croppedImg.getWidth()+"x"+croppedImg.getHeight()); //DEBUG
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
143 // util.dprintln(2, " time "+(System.currentTimeMillis()-startTime)+"ms");
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
144
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
145 if (croppedImg == null) {
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
146 util.dprintln(2, "ERROR(cropAndScale): error in crop");
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
147 throw new ImageOpException("Unable to crop");
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
148 }
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
149
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
150 // setup scale
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
151 AffineTransformOp scaleOp = new AffineTransformOp(
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
152 AffineTransform.getScaleInstance(scale, scale),
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
153 scaleInt);
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
154 BufferedImage scaledImg = scaleOp.filter(croppedImg, null);
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
155 croppedImg = null; // free opCrop
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
156
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
157 if (scaledImg == null) {
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
158 util.dprintln(2, "ERROR(cropAndScale): error in scale");
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
159 throw new ImageOpException("Unable to scale");
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
160 }
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
161 img = scaledImg;
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
162 }
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
163
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
164 }