Revision 2171 org.gvsig.tools/library/trunk/org.gvsig.tools/org.gvsig.tools.swing/org.gvsig.tools.swing.impl/src/main/java/org/gvsig/tools/swing/impl/DefaultSimpleImage.java
DefaultSimpleImage.java | ||
---|---|---|
1 | 1 |
package org.gvsig.tools.swing.impl; |
2 | 2 |
|
3 |
import java.awt.Dimension; |
|
3 | 4 |
import java.awt.Graphics2D; |
4 | 5 |
import java.awt.Image; |
5 | 6 |
import java.awt.MediaTracker; |
... | ... | |
13 | 14 |
import java.io.IOException; |
14 | 15 |
import java.io.InputStream; |
15 | 16 |
import java.net.URL; |
17 |
import java.util.Iterator; |
|
16 | 18 |
import javax.imageio.ImageIO; |
19 |
import javax.imageio.ImageReader; |
|
20 |
import javax.imageio.stream.ImageInputStream; |
|
17 | 21 |
import javax.swing.ImageIcon; |
18 | 22 |
import org.apache.commons.codec.DecoderException; |
19 | 23 |
import org.apache.commons.codec.binary.Base64; |
... | ... | |
25 | 29 |
* |
26 | 30 |
* @author jjdelcerro |
27 | 31 |
*/ |
32 |
@SuppressWarnings("UseSpecificCatch") |
|
28 | 33 |
public class DefaultSimpleImage implements SimpleImage { |
29 | 34 |
|
30 |
BufferedImage image = null; |
|
35 |
private BufferedImage image; |
|
36 |
private Object source; |
|
37 |
private Dimension dimensions; |
|
31 | 38 |
|
32 | 39 |
public static BufferedImage toBufferedImage(Image img) { |
40 |
if( img == null ) { |
|
41 |
throw new IllegalArgumentException("null image."); |
|
42 |
} |
|
33 | 43 |
if (img instanceof BufferedImage) { |
34 | 44 |
return (BufferedImage) img; |
35 | 45 |
} |
... | ... | |
47 | 57 |
} |
48 | 58 |
|
49 | 59 |
public DefaultSimpleImage() { |
60 |
this.image = null; |
|
61 |
this.dimensions = null; |
|
62 |
this.source = null; |
|
50 | 63 |
} |
51 | 64 |
|
52 | 65 |
public DefaultSimpleImage(BufferedImage image) { |
66 |
this(); |
|
53 | 67 |
this.image = image; |
68 |
this.source = image; |
|
54 | 69 |
} |
55 | 70 |
|
56 | 71 |
public DefaultSimpleImage(Object source) { |
57 |
this.image = this.load(source); |
|
72 |
this(); |
|
73 |
this.source = source; |
|
58 | 74 |
} |
59 | 75 |
|
60 |
public boolean isEmpty() { |
|
61 |
return this.image == null; |
|
76 |
public void clean() { |
|
77 |
this.image = null; |
|
78 |
this.dimensions = null; |
|
79 |
this.source = null; |
|
62 | 80 |
} |
63 |
|
|
81 |
|
|
82 |
@Override |
|
64 | 83 |
public BufferedImage getBufferedImage() { |
84 |
if( this.image == null ) { |
|
85 |
Dimension dim = new Dimension(); |
|
86 |
this.image = this.load(source, dim); |
|
87 |
this.dimensions = dim; |
|
88 |
} |
|
65 | 89 |
return this.image; |
66 | 90 |
} |
67 | 91 |
|
92 |
@Override |
|
93 |
public boolean isEmpty() { |
|
94 |
return this.image == null && this.source==null ; |
|
95 |
} |
|
96 |
|
|
97 |
@Override |
|
68 | 98 |
public void set(BufferedImage image) { |
69 | 99 |
this.image = image; |
100 |
this.source = image; |
|
70 | 101 |
} |
71 | 102 |
|
103 |
@Override |
|
72 | 104 |
public void set(Object source) { |
73 |
this.image = this.load(source); |
|
105 |
this.image = null; |
|
106 |
this.source = source; |
|
74 | 107 |
} |
75 | 108 |
|
76 |
private BufferedImage load(Object source) { |
|
109 |
private BufferedImage load(Object source, Dimension dimensions) {
|
|
77 | 110 |
BufferedImage theImage = null; |
78 | 111 |
try { |
79 | 112 |
if (source instanceof BufferedImage) { |
80 |
return (BufferedImage) source;
|
|
113 |
theImage = (BufferedImage) source;
|
|
81 | 114 |
|
82 | 115 |
} else if (source instanceof ImageIcon ) { |
83 | 116 |
ImageIcon icon = (ImageIcon)source; |
... | ... | |
85 | 118 |
if( loadStatus != MediaTracker.COMPLETE ) { |
86 | 119 |
icon.getDescription(); |
87 | 120 |
} |
88 |
return toBufferedImage(icon.getImage());
|
|
121 |
theImage = toBufferedImage(icon.getImage());
|
|
89 | 122 |
|
90 | 123 |
} else if (source instanceof Image) { |
91 |
return toBufferedImage((Image) source);
|
|
124 |
theImage = toBufferedImage((Image) source);
|
|
92 | 125 |
|
93 | 126 |
} else if (source instanceof byte[]) { |
94 | 127 |
ByteArrayInputStream is = new ByteArrayInputStream((byte[]) source); |
... | ... | |
129 | 162 |
IOUtils.closeQuietly(is); |
130 | 163 |
} |
131 | 164 |
} catch (IOException ex) { |
132 |
ex.printStackTrace(); |
|
133 | 165 |
return null; |
134 | 166 |
} |
167 |
if( theImage!=null && dimensions!=null ) { |
|
168 |
dimensions.width = theImage.getWidth(); |
|
169 |
dimensions.height = theImage.getHeight(); |
|
170 |
} |
|
135 | 171 |
return theImage; |
136 | 172 |
} |
173 |
|
|
174 |
private Dimension loadDimensions(Object source) { |
|
175 |
try { |
|
176 |
ImageInputStream in = ImageIO.createImageInputStream(source); |
|
177 |
Iterator<ImageReader> readers = ImageIO.getImageReaders(in); |
|
178 |
if (readers!=null && readers.hasNext()) { |
|
179 |
ImageReader reader = readers.next(); |
|
180 |
try { |
|
181 |
reader.setInput(in); |
|
182 |
return new Dimension(reader.getWidth(0), reader.getHeight(0)); |
|
183 |
} finally { |
|
184 |
reader.dispose(); |
|
185 |
} |
|
186 |
} |
|
187 |
Dimension dim = new Dimension(); |
|
188 |
this.image = this.load(source, dim); |
|
189 |
return dim; |
|
190 |
} catch (IOException ex) { |
|
191 |
throw new RuntimeException("Can't load dimensions of the image.", ex); |
|
192 |
} |
|
193 |
} |
|
137 | 194 |
|
195 |
@Override |
|
138 | 196 |
public int getWidth() { |
139 |
return this.image.getWidth(); |
|
197 |
if( this.dimensions == null ) { |
|
198 |
this.dimensions = this.loadDimensions(source); |
|
199 |
} |
|
200 |
return this.dimensions.width; |
|
140 | 201 |
} |
141 | 202 |
|
203 |
@Override |
|
142 | 204 |
public int getHeight() { |
143 |
return this.image.getHeight(); |
|
205 |
if( this.dimensions == null ) { |
|
206 |
this.dimensions = this.loadDimensions(source); |
|
207 |
} |
|
208 |
return this.dimensions.height; |
|
144 | 209 |
} |
145 | 210 |
|
211 |
@Override |
|
146 | 212 |
public DefaultSimpleImage resize(double factor) { |
147 | 213 |
BufferedImage theImage = this.getBufferedImage(); |
148 | 214 |
int w = theImage.getWidth(); |
... | ... | |
157 | 223 |
return new DefaultSimpleImage(newImage); |
158 | 224 |
} |
159 | 225 |
|
226 |
@Override |
|
160 | 227 |
public DefaultSimpleImage resize(int width, int height) { |
161 | 228 |
BufferedImage theImage = this.getBufferedImage(); |
162 | 229 |
int w = theImage.getWidth(); |
... | ... | |
169 | 236 |
return new DefaultSimpleImage(newImage); |
170 | 237 |
} |
171 | 238 |
|
239 |
@Override |
|
172 | 240 |
public DefaultSimpleImage rotate(int angle) { |
173 | 241 |
BufferedImage theImage = this.getBufferedImage(); |
174 | 242 |
int w = theImage.getWidth(); |
... | ... | |
181 | 249 |
return new DefaultSimpleImage(newImage); |
182 | 250 |
} |
183 | 251 |
|
252 |
@Override |
|
184 | 253 |
public DefaultSimpleImage horizontalflip() { |
185 | 254 |
BufferedImage img = this.getBufferedImage(); |
186 | 255 |
int w = img.getWidth(); |
... | ... | |
192 | 261 |
return new DefaultSimpleImage(newImage); |
193 | 262 |
} |
194 | 263 |
|
264 |
@Override |
|
195 | 265 |
public DefaultSimpleImage verticalflip() { |
196 | 266 |
BufferedImage img = this.getBufferedImage(); |
197 | 267 |
int w = img.getWidth(); |
... | ... | |
203 | 273 |
return new DefaultSimpleImage(newImage); |
204 | 274 |
} |
205 | 275 |
|
276 |
@Override |
|
206 | 277 |
public DefaultSimpleImage transform(AffineTransform transform, int width, int height) { |
207 | 278 |
BufferedImage img = this.getBufferedImage(); |
208 | 279 |
BufferedImage newImage = new BufferedImage(width, height, img.getColorModel().getTransparency()); |
... | ... | |
214 | 285 |
return new DefaultSimpleImage(newImage); |
215 | 286 |
} |
216 | 287 |
|
288 |
@Override |
|
217 | 289 |
public DefaultSimpleImage transform(AffineTransform transform) { |
218 | 290 |
BufferedImage img = this.getBufferedImage(); |
219 | 291 |
int w = img.getWidth(); |
Also available in: Unified diff