Mercurial > hg > digilib-old
comparison servlet/src/digilib/image/JAIDocuImage.java @ 1:0ff3ede32060
Initial revision
author | robcast |
---|---|
date | Thu, 17 Jan 2002 15:25:46 +0100 |
parents | |
children | 3b8797fc3e90 6d2032b6121d 9cedd170b581 |
comparison
equal
deleted
inserted
replaced
0:ffd2df307e81 | 1:0ff3ede32060 |
---|---|
1 /* JAIDocuImage -- Image class implementation using JAI (Java Advanced Imaging) | |
2 | |
3 Digital Image Library servlet components | |
4 | |
5 Copyright (C) 2001, 2002 Robert Casties (robcast@mail.berlios.de) | |
6 | |
7 This program is free software; you can redistribute it and/or modify it | |
8 under the terms of the GNU General Public License as published by the | |
9 Free Software Foundation; either version 2 of the License, or (at your | |
10 option) any later version. | |
11 | |
12 Please read license.txt for the full details. A copy of the GPL | |
13 may be found at http://www.gnu.org/copyleft/lgpl.html | |
14 | |
15 You should have received a copy of the GNU General Public License | |
16 along with this program; if not, write to the Free Software | |
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
18 | |
19 */ | |
20 | |
21 package digilib.image; | |
22 | |
23 import javax.servlet.*; | |
24 import javax.servlet.http.*; | |
25 import java.io.*; | |
26 import java.util.*; | |
27 | |
28 import java.awt.*; | |
29 import java.awt.image.*; | |
30 import java.awt.image.renderable.*; | |
31 import javax.media.jai.*; | |
32 | |
33 import digilib.*; | |
34 import digilib.io.*; | |
35 | |
36 | |
37 public class JAIDocuImage extends DocuImageImpl { | |
38 | |
39 private RenderedImage img; | |
40 | |
41 public JAIDocuImage() { | |
42 } | |
43 | |
44 public JAIDocuImage(Utils u) { | |
45 util = u; | |
46 } | |
47 | |
48 /** | |
49 * load image file | |
50 */ | |
51 public void loadImage(File f) throws FileOpException { | |
52 System.gc(); | |
53 img = JAI.create("fileload", f.getAbsolutePath()); | |
54 if (img == null) { | |
55 util.dprintln(3, "ERROR(loadImage): unable to load file"); | |
56 throw new FileOpException("Unable to load File!"); | |
57 } | |
58 } | |
59 | |
60 /** | |
61 * write image of type mt to Stream | |
62 */ | |
63 public void writeImage(String mt, ServletResponse res) | |
64 throws FileOpException { | |
65 try { | |
66 // setup output | |
67 ParameterBlock pb3 = new ParameterBlock(); | |
68 pb3.addSource(img); | |
69 pb3.add(res.getOutputStream()); | |
70 if (mt == "image/jpeg") { | |
71 pb3.add("JPEG"); | |
72 } else if (mt == "image/png") { | |
73 pb3.add("PNG"); | |
74 } else { | |
75 // unknown mime type | |
76 util.dprintln(2, "ERROR(writeImage): Unknown mime type "+mt); | |
77 throw new FileOpException("Unknown mime type: "+mt); | |
78 } | |
79 res.setContentType(mt); | |
80 // render output | |
81 JAI.create("encode", pb3); | |
82 | |
83 } catch (IOException e) { | |
84 throw new FileOpException("Error writing image."); | |
85 } | |
86 } | |
87 | |
88 public int getWidth() { | |
89 if (img != null) { | |
90 return img.getWidth(); | |
91 } | |
92 return 0; | |
93 } | |
94 | |
95 public int getHeight() { | |
96 if (img != null) { | |
97 return img.getHeight(); | |
98 } | |
99 return 0; | |
100 } | |
101 | |
102 | |
103 /** | |
104 * crop and scale image | |
105 * take rectangle width,height at position x_off,y_off | |
106 * and scale by scale | |
107 */ | |
108 public void cropAndScale(int x_off, int y_off, int width, int height, | |
109 float scale, int qual) throws ImageOpException { | |
110 | |
111 Interpolation scaleInt = null; | |
112 // setup interpolation quality | |
113 if (qual > 1) { | |
114 util.dprintln(4, "quality q2"); | |
115 scaleInt = Interpolation.getInstance(Interpolation.INTERP_BICUBIC); | |
116 } else if (qual == 1) { | |
117 util.dprintln(4, "quality q1"); | |
118 scaleInt = Interpolation.getInstance(Interpolation.INTERP_BILINEAR); | |
119 } else { | |
120 util.dprintln(4, "quality q0"); | |
121 scaleInt = Interpolation.getInstance(Interpolation.INTERP_NEAREST); | |
122 } | |
123 | |
124 // setup Crop | |
125 ParameterBlock pb1 = new ParameterBlock(); | |
126 pb1.addSource(img); | |
127 pb1.add((float)x_off); | |
128 pb1.add((float)y_off); | |
129 pb1.add((float)width); | |
130 pb1.add((float)height); | |
131 RenderedImage croppedImg = JAI.create("crop", pb1); | |
132 img = null; // free img | |
133 | |
134 util.dprintln(3, "CROP:"+croppedImg.getWidth()+"x"+croppedImg.getHeight()); //DEBUG | |
135 | |
136 if (croppedImg == null) { | |
137 util.dprintln(2, "ERROR(cropAndScale): error in crop"); | |
138 throw new ImageOpException("Unable to crop"); | |
139 } | |
140 | |
141 // setup scale | |
142 ParameterBlock pb2 = new ParameterBlock(); | |
143 pb2.addSource(croppedImg); | |
144 pb2.add(scale); | |
145 pb2.add(scale); | |
146 pb2.add(0f); | |
147 pb2.add(0f); | |
148 pb2.add(scaleInt); | |
149 // the following is nice but way too slow... | |
150 //if (opCrop.getColorModel().getPixelSize() < 8) { | |
151 // change color model if necessary | |
152 // util.dprintln("converting color model..."); | |
153 // BufferedImage bi = new BufferedImage(1, 1, BufferedImage.TYPE_BYTE_GRAY); | |
154 // ImageLayout lay = new ImageLayout(bi); | |
155 // rh = new RenderingHints(JAI.KEY_IMAGE_LAYOUT, lay); | |
156 //} | |
157 RenderedImage scaledImg = JAI.create("scale", pb2); | |
158 croppedImg = null; // free opCrop | |
159 | |
160 if (scaledImg == null) { | |
161 util.dprintln(2, "ERROR(cropAndScale): error in scale"); | |
162 throw new ImageOpException("Unable to scale"); | |
163 } | |
164 | |
165 img = scaledImg; | |
166 } | |
167 | |
168 } |