annotate servlet/src/digilib/image/ImageLoaderDocuImage.java @ 87:5d44cd2481a5

New version 1.8b4. Utils without static debuglevel.
author robcast
date Mon, 17 Mar 2003 15:23:17 +0100
parents 997ba69afb81
children 6d35c945a5d6
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
85
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
5 Copyright (C) 2002, 2003 Robert Casties (robcast@mail.berlios.de)
1
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
86
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
23 import java.awt.Dimension;
85
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
24 import java.awt.Rectangle;
73
3b8797fc3e90 New servlet version 1.5b.
robcast
parents: 1
diff changeset
25 import java.awt.geom.AffineTransform;
3b8797fc3e90 New servlet version 1.5b.
robcast
parents: 1
diff changeset
26 import java.awt.image.AffineTransformOp;
3b8797fc3e90 New servlet version 1.5b.
robcast
parents: 1
diff changeset
27 import java.awt.image.BufferedImage;
85
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
28 import java.awt.image.RescaleOp;
73
3b8797fc3e90 New servlet version 1.5b.
robcast
parents: 1
diff changeset
29 import java.io.File;
3b8797fc3e90 New servlet version 1.5b.
robcast
parents: 1
diff changeset
30 import java.io.IOException;
79
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
31 import java.io.OutputStream;
85
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
32 import java.util.Iterator;
1
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
33
73
3b8797fc3e90 New servlet version 1.5b.
robcast
parents: 1
diff changeset
34 import javax.imageio.ImageIO;
85
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
35 import javax.imageio.ImageReadParam;
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
36 import javax.imageio.ImageReader;
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
37 import javax.imageio.stream.ImageInputStream;
1
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
38
86
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
39 import digilib.io.DocuFile;
73
3b8797fc3e90 New servlet version 1.5b.
robcast
parents: 1
diff changeset
40 import digilib.io.FileOpException;
86
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
41 import digilib.io.FileOps;
1
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
42
73
3b8797fc3e90 New servlet version 1.5b.
robcast
parents: 1
diff changeset
43 /** Implementation of DocuImage using the ImageLoader API of Java 1.4 and Java2D. */
1
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
44 public class ImageLoaderDocuImage extends DocuImageImpl {
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
45
86
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
46 /** image object */
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
47 protected BufferedImage img;
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
48 /** interpolation type */
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
49 protected int interpol;
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
50 /** ImageIO image reader */
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
51 protected ImageReader reader;
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
52 /** File that was read */
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
53 protected File imgFile;
85
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
54
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
55 /* loadSubimage is supported. */
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
56 public boolean isSubimageSupported() {
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
57 return true;
79
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
58 }
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
59
85
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
60 public void setQuality(int qual) {
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
61 quality = qual;
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
62 // setup interpolation quality
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
63 if (qual > 0) {
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
64 util.dprintln(4, "quality q1");
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
65 interpol = AffineTransformOp.TYPE_BILINEAR;
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
66 } else {
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
67 util.dprintln(4, "quality q0");
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
68 interpol = AffineTransformOp.TYPE_NEAREST_NEIGHBOR;
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
69 }
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
70 }
86
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
71
85
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
72 public int getHeight() {
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
73 int h = 0;
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
74 try {
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
75 if (img == null) {
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
76 h = reader.getHeight(0);
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
77 } else {
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
78 h = img.getHeight();
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
79 }
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
80 } catch (IOException e) {
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
81 e.printStackTrace();
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
82 }
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
83 return h;
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
84 }
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
85
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
86 public int getWidth() {
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
87 int w = 0;
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
88 try {
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
89 if (img == null) {
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
90 w = reader.getWidth(0);
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
91 } else {
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
92 w = img.getWidth();
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
93 }
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
94 } catch (IOException e) {
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
95 e.printStackTrace();
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
96 }
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
97 return w;
79
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
98 }
1
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
99
86
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
100 /* load image file */
79
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
101 public void loadImage(File f) throws FileOpException {
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
102 util.dprintln(10, "loadImage!");
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
103 System.gc();
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
104 try {
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
105 img = ImageIO.read(f);
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
106 if (img == null) {
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
107 util.dprintln(3, "ERROR(loadImage): unable to load file");
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
108 throw new FileOpException("Unable to load File!");
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
109 }
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
110 } catch (IOException e) {
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
111 throw new FileOpException("Error reading image.");
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
112 }
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
113 }
1
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
114
86
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
115 /** Get an ImageReader for the image file.
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
116 *
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
117 */
85
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
118 public void preloadImage(File f) throws FileOpException {
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
119 System.gc();
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
120 try {
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
121 ImageInputStream istream = ImageIO.createImageInputStream(f);
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
122 Iterator readers = ImageIO.getImageReaders(istream);
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
123 reader = (ImageReader) readers.next();
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
124 reader.setInput(istream);
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
125 } catch (IOException e) {
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
126 util.dprintln(3, "ERROR(loadImage): unable to load file");
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
127 throw new FileOpException("Unable to load File!" + e);
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
128 }
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
129 if (reader == null) {
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
130 util.dprintln(3, "ERROR(loadImage): unable to load file");
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
131 throw new FileOpException("Unable to load File!");
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
132 }
86
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
133 imgFile = f;
85
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
134 }
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
135
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
136 /* Load an image file into the Object. */
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
137 public void loadSubimage(File f, Rectangle region, int prescale)
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
138 throws FileOpException {
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
139 System.gc();
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
140 try {
86
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
141 if ((reader == null) || (imgFile != f)) {
85
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
142 preloadImage(f);
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
143 }
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
144 // set up reader parameters
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
145 ImageReadParam readParam = reader.getDefaultReadParam();
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
146 readParam.setSourceRegion(region);
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
147 readParam.setSourceSubsampling(prescale, prescale, 0, 0);
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
148 // read image
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
149 img = reader.read(0, readParam);
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
150 } catch (IOException e) {
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
151 util.dprintln(3, "ERROR(loadImage): unable to load file");
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
152 throw new FileOpException("Unable to load File!");
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
153 }
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
154 if (img == null) {
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
155 util.dprintln(3, "ERROR(loadImage): unable to load file");
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
156 throw new FileOpException("Unable to load File!");
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
157 }
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
158 }
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
159
86
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
160 /* write image of type mt to Stream */
79
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
161 public void writeImage(String mt, OutputStream ostream)
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
162 throws FileOpException {
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
163 util.dprintln(10, "writeImage!");
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
164 try {
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
165 // setup output
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
166 String type = "png";
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
167 if (mt == "image/jpeg") {
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
168 type = "jpeg";
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
169 } else if (mt == "image/png") {
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
170 type = "png";
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
171 } else {
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
172 // unknown mime type
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
173 util.dprintln(2, "ERROR(writeImage): Unknown mime type " + mt);
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
174 throw new FileOpException("Unknown mime type: " + mt);
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
175 }
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
176 // render output
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
177 if (ImageIO.write(img, type, ostream)) {
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
178 // writing was OK
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
179 return;
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
180 } else {
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
181 throw new FileOpException("Error writing image: Unknown image format!");
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
182 }
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
183 } catch (IOException e) {
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
184 // e.printStackTrace();
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
185 throw new FileOpException("Error writing image.");
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
186 }
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
187 }
1
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
188
79
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
189 public void scale(double scale) throws ImageOpException {
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
190 // setup scale
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
191 AffineTransformOp scaleOp =
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
192 new AffineTransformOp(
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
193 AffineTransform.getScaleInstance(scale, scale),
85
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
194 interpol);
79
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
195 BufferedImage scaledImg = scaleOp.filter(img, null);
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
196
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
197 if (scaledImg == null) {
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
198 util.dprintln(2, "ERROR(cropAndScale): error in scale");
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
199 throw new ImageOpException("Unable to scale");
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
200 }
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
201 img = scaledImg;
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
202 }
1
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
203
79
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
204 public void crop(int x_off, int y_off, int width, int height)
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
205 throws ImageOpException {
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
206 // setup Crop
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
207 BufferedImage croppedImg = img.getSubimage(x_off, y_off, width, height);
1
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
208
79
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
209 util.dprintln(
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
210 3,
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
211 "CROP:" + croppedImg.getWidth() + "x" + croppedImg.getHeight());
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
212 //DEBUG
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
213 // util.dprintln(2, " time "+(System.currentTimeMillis()-startTime)+"ms");
1
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
214
79
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
215 if (croppedImg == null) {
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
216 util.dprintln(2, "ERROR(cropAndScale): error in crop");
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
217 throw new ImageOpException("Unable to crop");
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
218 }
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
219 img = croppedImg;
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
220 }
1
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
221
86
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
222 public void enhance(float mult, float add) throws ImageOpException {
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
223 /* Only one constant should work regardless of the number of bands
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
224 * according to the JDK spec.
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
225 * Doesn't work on JDK 1.4 for OSX and Linux (at least).
85
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
226 */
86
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
227 /* RescaleOp scaleOp =
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
228 new RescaleOp(
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
229 (float)mult, (float)add,
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
230 null);
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
231 scaleOp.filter(img, img);
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
232 */
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
233 /* The number of constants must match the number of bands in the image.
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
234 */
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
235 int ncol = img.getColorModel().getNumColorComponents();
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
236 float[] dm = new float[ncol];
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
237 float[] da = new float[ncol];
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
238 for (int i = 0; i < ncol; i++) {
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
239 dm[i] = (float) mult;
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
240 da[i] = (float) add;
85
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
241 }
86
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
242 RescaleOp scaleOp = new RescaleOp(dm, da, null);
85
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
243 scaleOp.filter(img, img);
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
244
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
245 }
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
246
86
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
247 public void enhanceRGB(float[] rgbm, float[] rgba)
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
248 throws ImageOpException {
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
249 /* The number of constants must match the number of bands in the image.
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
250 * We do only 3 (RGB) bands.
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
251 */
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
252 int ncol = img.getColorModel().getNumColorComponents();
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
253 if ((ncol != 3) || (rgbm.length != 3) || (rgba.length != 3)) {
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
254 util.dprintln(
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
255 2,
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
256 "ERROR(enhance): unknown number of color bands or coefficients ("
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
257 + ncol
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
258 + ")");
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
259 return;
79
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
260 }
86
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
261 RescaleOp scaleOp = new RescaleOp(rgbOrdered(rgbm), rgbOrdered(rgba), null);
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
262 scaleOp.filter(img, img);
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
263 }
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
264
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
265 /** Ensures that the array f is in the right order to map the images RGB components.
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
266 */
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
267 public float[] rgbOrdered(float[] fa) {
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
268 float[] fb = new float[3];
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
269 int t = img.getType();
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
270 if ((t == BufferedImage.TYPE_3BYTE_BGR)
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
271 || (t == BufferedImage.TYPE_4BYTE_ABGR)
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
272 || (t == BufferedImage.TYPE_4BYTE_ABGR_PRE)) {
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
273 // BGR Type (actually it looks like RBG...)
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
274 fb[0] = fa[0];
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
275 fb[1] = fa[2];
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
276 fb[2] = fa[1];
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
277 } else {
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
278 fb = fa;
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
279 }
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
280 return fb;
85
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
281 }
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
282
86
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
283 public void rotate(double angle) throws ImageOpException {
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
284 // setup rotation
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
285 double rangle = Math.toRadians(angle);
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
286 double x = getWidth() / 2;
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
287 double y = getHeight() / 2;
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
288 AffineTransformOp rotOp =
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
289 new AffineTransformOp(
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
290 AffineTransform.getRotateInstance(rangle, x, y),
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
291 interpol);
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
292 BufferedImage rotImg = rotOp.filter(img, null);
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
293
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
294 if (rotImg == null) {
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
295 util.dprintln(2, "ERROR: error in rotate");
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
296 throw new ImageOpException("Unable to rotate");
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
297 }
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
298 img = rotImg;
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
299 }
85
4e6757e8ccd4 New enhanced ImageLoader stuff.
robcast
parents: 79
diff changeset
300
86
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
301 public void mirror(double angle) throws ImageOpException {
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
302 // setup mirror
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
303 double mx = 1;
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
304 double my = 1;
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
305 double tx = 0;
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
306 double ty = 0;
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
307 if (Math.abs(angle - 0) < epsilon) {
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
308 // 0 degree
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
309 mx = -1;
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
310 tx = getWidth();
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
311 } else if (Math.abs(angle - 90) < epsilon) {
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
312 // 90 degree
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
313 my = -1;
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
314 ty = getHeight();
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
315 } else if (Math.abs(angle - 180) < epsilon) {
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
316 // 180 degree
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
317 mx = -1;
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
318 tx = getWidth();
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
319 } else if (Math.abs(angle - 270) < epsilon) {
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
320 // 270 degree
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
321 my = -1;
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
322 ty = getHeight();
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
323 } else if (Math.abs(angle - 360) < epsilon) {
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
324 // 360 degree
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
325 mx = -1;
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
326 tx = getWidth();
79
63c8186455c1 Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents: 73
diff changeset
327 }
86
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
328 AffineTransformOp mirOp =
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
329 new AffineTransformOp(
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
330 new AffineTransform(mx, 0, 0, my, tx, ty),
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
331 interpol);
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
332 BufferedImage mirImg = mirOp.filter(img, null);
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
333
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
334 if (mirImg == null) {
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
335 util.dprintln(2, "ERROR: error in mirror");
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
336 throw new ImageOpException("Unable to mirror");
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
337 }
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
338 img = mirImg;
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
339 }
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
340
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
341 /* check image size and type and store in DocuFile f */
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
342 public boolean checkFile(DocuFile f) throws IOException {
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
343 // see if f is already loaded
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
344 if ((reader == null) || (imgFile != f.getFile())) {
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
345 preloadImage(f.getFile());
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
346 }
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
347 Dimension d = new Dimension();
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
348 d.setSize(reader.getWidth(0), reader.getHeight(0));
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
349 f.setSize(d);
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
350 // String t = reader.getFormatName();
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
351 String t = FileOps.mimeForFile(f.getFile());
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
352 f.setMimetype(t);
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
353 f.setChecked(true);
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
354 return true;
997ba69afb81 New version 1.8b1.
robcast
parents: 85
diff changeset
355 }
1
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
356
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
357 }