Statistics
| Revision:

gvsig-tools / 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 @ 2252

History | View | Annotate | Download (11.5 KB)

1 1840 jjdelcerro
package org.gvsig.tools.swing.impl;
2
3 2171 jjdelcerro
import java.awt.Dimension;
4 1840 jjdelcerro
import java.awt.Graphics2D;
5
import java.awt.Image;
6 1846 jjdelcerro
import java.awt.MediaTracker;
7 1840 jjdelcerro
import java.awt.RenderingHints;
8
import java.awt.geom.AffineTransform;
9
import java.awt.image.BufferedImage;
10
import java.io.ByteArrayInputStream;
11 2017 jjdelcerro
import java.io.ByteArrayOutputStream;
12 1840 jjdelcerro
import java.io.File;
13
import java.io.FileInputStream;
14
import java.io.IOException;
15
import java.io.InputStream;
16 2252 jjdelcerro
import java.io.OutputStream;
17 1840 jjdelcerro
import java.net.URL;
18 2171 jjdelcerro
import java.util.Iterator;
19 1840 jjdelcerro
import javax.imageio.ImageIO;
20 2171 jjdelcerro
import javax.imageio.ImageReader;
21
import javax.imageio.stream.ImageInputStream;
22 1846 jjdelcerro
import javax.swing.ImageIcon;
23 1840 jjdelcerro
import org.apache.commons.codec.DecoderException;
24
import org.apache.commons.codec.binary.Base64;
25
import org.apache.commons.codec.binary.Hex;
26
import org.apache.commons.io.IOUtils;
27
import org.gvsig.tools.swing.api.SimpleImage;
28
29
/**
30
 *
31
 * @author jjdelcerro
32
 */
33 2171 jjdelcerro
@SuppressWarnings("UseSpecificCatch")
34 1840 jjdelcerro
public class DefaultSimpleImage implements SimpleImage {
35
36 2171 jjdelcerro
    private BufferedImage image;
37
    private Object source;
38
    private Dimension dimensions;
39 1840 jjdelcerro
40 1846 jjdelcerro
    public static BufferedImage toBufferedImage(Image img) {
41 2171 jjdelcerro
        if( img == null ) {
42
          throw new IllegalArgumentException("null image.");
43
        }
44 1846 jjdelcerro
        if (img instanceof BufferedImage) {
45
            return (BufferedImage) img;
46
        }
47
        // Create a buffered image with transparency
48
        BufferedImage bimage = new BufferedImage(
49
                img.getWidth(null),
50
                img.getHeight(null),
51
                BufferedImage.TYPE_INT_ARGB
52
        );
53
        // Draw the image on to the buffered image
54
        Graphics2D bGr = bimage.createGraphics();
55
        bGr.drawImage(img, 0, 0, null);
56
        bGr.dispose();
57
        return bimage;
58
    }
59
60 1840 jjdelcerro
    public DefaultSimpleImage() {
61 2171 jjdelcerro
        this.image = null;
62
        this.dimensions = null;
63
        this.source = null;
64 1840 jjdelcerro
    }
65
66
    public DefaultSimpleImage(BufferedImage image) {
67 2171 jjdelcerro
        this();
68 1840 jjdelcerro
        this.image = image;
69 2171 jjdelcerro
        this.source = image;
70 1840 jjdelcerro
    }
71
72
    public DefaultSimpleImage(Object source) {
73 2171 jjdelcerro
        this();
74
        this.source = source;
75 1840 jjdelcerro
    }
76
77 2171 jjdelcerro
    public void clean() {
78
        this.image = null;
79
        this.dimensions = null;
80
        this.source = null;
81 1840 jjdelcerro
    }
82 2171 jjdelcerro
83
    @Override
84 1840 jjdelcerro
    public BufferedImage getBufferedImage() {
85 2171 jjdelcerro
        if( this.image == null ) {
86
          Dimension dim = new Dimension();
87
          this.image = this.load(source, dim);
88
          this.dimensions = dim;
89
        }
90 1840 jjdelcerro
        return this.image;
91
    }
92
93 2171 jjdelcerro
    @Override
94
    public boolean isEmpty() {
95
        return this.image == null && this.source==null ;
96
    }
97
98
    @Override
99 1840 jjdelcerro
    public void set(BufferedImage image) {
100
        this.image = image;
101 2171 jjdelcerro
        this.source = image;
102 1840 jjdelcerro
    }
103
104 2171 jjdelcerro
    @Override
105 1840 jjdelcerro
    public void set(Object source) {
106 2171 jjdelcerro
        this.image = null;
107
        this.source = source;
108 1840 jjdelcerro
    }
109
110 2171 jjdelcerro
    private BufferedImage load(Object source, Dimension dimensions) {
111 1840 jjdelcerro
        BufferedImage theImage = null;
112
        try {
113
            if (source instanceof BufferedImage) {
114 2171 jjdelcerro
                theImage = (BufferedImage) source;
115 1846 jjdelcerro
116
            } else if (source instanceof ImageIcon ) {
117
                ImageIcon icon = (ImageIcon)source;
118
                int loadStatus = icon.getImageLoadStatus();
119
                if( loadStatus != MediaTracker.COMPLETE ) {
120
                    icon.getDescription();
121
                }
122 2171 jjdelcerro
                theImage = toBufferedImage(icon.getImage());
123 1846 jjdelcerro
124 1840 jjdelcerro
            } else if (source instanceof Image) {
125 2171 jjdelcerro
                theImage = toBufferedImage((Image) source);
126 1846 jjdelcerro
127 1840 jjdelcerro
            } else if (source instanceof byte[]) {
128
                ByteArrayInputStream is = new ByteArrayInputStream((byte[]) source);
129
                theImage = ImageIO.read(is);
130 1846 jjdelcerro
131 1840 jjdelcerro
            } else if (source instanceof File) {
132
                theImage = ImageIO.read((File) source);
133 1846 jjdelcerro
134 1840 jjdelcerro
            } else if (source instanceof URL) {
135
                theImage = ImageIO.read((URL) source);
136 1846 jjdelcerro
137 1840 jjdelcerro
            } else if (source instanceof String) {
138
                InputStream is;
139
                String s = (String) source;
140
                File f = new File(s);
141
                if (f.exists()) {
142
                    is = new FileInputStream(f);
143
                } else {
144
                    try {
145
                        URL url = new URL(s);
146
                        is = url.openStream();
147
                        is.available(); // Force exception if is null
148
                    } catch (Exception ex) {
149
                        try {
150
                            byte[] data = Hex.decodeHex(s.toCharArray());
151
                            is = new ByteArrayInputStream(data);
152
                        } catch (DecoderException ex2) {
153
                            try {
154
                                byte[] data = Base64.decodeBase64(s);
155
                                is = new ByteArrayInputStream(data);
156
                            } catch (Exception ex3) {
157
                                return null;
158
                            }
159
                        }
160
                    }
161
                }
162
                theImage = ImageIO.read(is);
163
                IOUtils.closeQuietly(is);
164
            }
165
        } catch (IOException ex) {
166
            return null;
167
        }
168 2171 jjdelcerro
        if( theImage!=null && dimensions!=null ) {
169
          dimensions.width = theImage.getWidth();
170
          dimensions.height = theImage.getHeight();
171
        }
172 1840 jjdelcerro
        return theImage;
173
    }
174 2171 jjdelcerro
175
    private Dimension loadDimensions(Object source) {
176
      try {
177
        ImageInputStream in = ImageIO.createImageInputStream(source);
178
        Iterator<ImageReader> readers = ImageIO.getImageReaders(in);
179
        if (readers!=null && readers.hasNext()) {
180
          ImageReader reader = readers.next();
181
          try {
182
            reader.setInput(in);
183
            return new Dimension(reader.getWidth(0), reader.getHeight(0));
184
          } finally {
185
            reader.dispose();
186
          }
187
        }
188
        Dimension dim = new Dimension();
189
        this.image = this.load(source, dim);
190
        return dim;
191
      } catch (IOException ex) {
192
        throw new RuntimeException("Can't load dimensions of the image.", ex);
193
      }
194
    }
195 1840 jjdelcerro
196 2171 jjdelcerro
    @Override
197 1840 jjdelcerro
    public int getWidth() {
198 2171 jjdelcerro
      if( this.dimensions == null ) {
199
        this.dimensions = this.loadDimensions(source);
200
      }
201
      return this.dimensions.width;
202 1840 jjdelcerro
    }
203
204 2171 jjdelcerro
    @Override
205 1840 jjdelcerro
    public int getHeight() {
206 2171 jjdelcerro
      if( this.dimensions == null ) {
207
        this.dimensions = this.loadDimensions(source);
208
      }
209
      return this.dimensions.height;
210 1840 jjdelcerro
    }
211
212 2171 jjdelcerro
    @Override
213 1840 jjdelcerro
    public DefaultSimpleImage resize(double factor) {
214
        BufferedImage theImage = this.getBufferedImage();
215
        int w = theImage.getWidth();
216
        int h = theImage.getHeight();
217
        int width = (int) (w * factor);
218
        int height = (int) (h * factor);
219
        BufferedImage newImage = new BufferedImage(width, height, theImage.getType());
220
        Graphics2D g = newImage.createGraphics();
221
        g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
222
        g.drawImage(theImage, 0, 0, width, height, 0, 0, w, h, null);
223
        g.dispose();
224
        return new DefaultSimpleImage(newImage);
225
    }
226
227 2171 jjdelcerro
    @Override
228 1840 jjdelcerro
    public DefaultSimpleImage resize(int width, int height) {
229
        BufferedImage theImage = this.getBufferedImage();
230
        int w = theImage.getWidth();
231
        int h = theImage.getHeight();
232
        BufferedImage newImage = new BufferedImage(width, height, theImage.getType());
233
        Graphics2D g = newImage.createGraphics();
234
        g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
235
        g.drawImage(theImage, 0, 0, width, height, 0, 0, w, h, null);
236
        g.dispose();
237
        return new DefaultSimpleImage(newImage);
238
    }
239
240 2171 jjdelcerro
    @Override
241 1840 jjdelcerro
    public DefaultSimpleImage rotate(int angle) {
242
        BufferedImage theImage = this.getBufferedImage();
243
        int w = theImage.getWidth();
244
        int h = theImage.getHeight();
245
        BufferedImage newImage = new BufferedImage(w, h, theImage.getType());
246
        Graphics2D g = newImage.createGraphics();
247
        g.rotate(Math.toRadians(angle), w / 2, h / 2);
248
        g.drawImage(theImage, null, 0, 0);
249
        g.dispose();
250
        return new DefaultSimpleImage(newImage);
251
    }
252
253 2171 jjdelcerro
    @Override
254 1840 jjdelcerro
    public DefaultSimpleImage horizontalflip() {
255
        BufferedImage img = this.getBufferedImage();
256
        int w = img.getWidth();
257
        int h = img.getHeight();
258
        BufferedImage newImage = new BufferedImage(w, h, img.getType());
259
        Graphics2D g = newImage.createGraphics();
260
        g.drawImage(img, 0, 0, w, h, w, 0, 0, h, null);
261
        g.dispose();
262
        return new DefaultSimpleImage(newImage);
263
    }
264
265 2171 jjdelcerro
    @Override
266 1840 jjdelcerro
    public DefaultSimpleImage verticalflip() {
267
        BufferedImage img = this.getBufferedImage();
268
        int w = img.getWidth();
269
        int h = img.getHeight();
270
        BufferedImage newImage = new BufferedImage(w, h, img.getColorModel().getTransparency());
271
        Graphics2D g = newImage.createGraphics();
272
        g.drawImage(img, 0, 0, w, h, 0, h, w, 0, null);
273
        g.dispose();
274
        return new DefaultSimpleImage(newImage);
275
    }
276
277 2171 jjdelcerro
    @Override
278 1840 jjdelcerro
    public DefaultSimpleImage transform(AffineTransform transform, int width, int height) {
279
        BufferedImage img = this.getBufferedImage();
280
        BufferedImage newImage = new BufferedImage(width, height, img.getColorModel().getTransparency());
281
        Graphics2D g = newImage.createGraphics();
282
        g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
283
        g.setTransform(transform);
284
        g.drawImage(img, 0, 0, null);
285
        g.dispose();
286
        return new DefaultSimpleImage(newImage);
287
    }
288
289 2171 jjdelcerro
    @Override
290 1840 jjdelcerro
    public DefaultSimpleImage transform(AffineTransform transform) {
291
        BufferedImage img = this.getBufferedImage();
292
        int w = img.getWidth();
293
        int h = img.getHeight();
294
        BufferedImage newImage = new BufferedImage(w, h, img.getColorModel().getTransparency());
295
        Graphics2D g = newImage.createGraphics();
296
        g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
297
        g.setTransform(transform);
298
        g.drawImage(img, 0, 0, null);
299
        g.dispose();
300
        return new DefaultSimpleImage(newImage);
301
    }
302
303 2017 jjdelcerro
    private String bytearray_hex(byte[] data) {
304
        StringBuilder builder = new StringBuilder();
305
        for (byte abyte : data) {
306
            int v = abyte & 0xff;
307
            builder.append(String.format("%02x", v));
308
        }
309
        return builder.toString();
310
    }
311
312
    @Override
313
    public byte[] toBytearray() {
314 2252 jjdelcerro
        return toBytearray("png");
315
    }
316
317
    @Override
318
    public byte[] toBytearray(String format) {
319 2017 jjdelcerro
        try {
320
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
321 2252 jjdelcerro
            ImageIO.write( this.image, format, baos );
322 2017 jjdelcerro
            baos.flush();
323
            byte[] imageInByte = baos.toByteArray();
324
            baos.close();
325
            return imageInByte;
326
        } catch (IOException ex) {
327
            return null;
328
        }
329
    }
330
331
    @Override
332
    public String toString() {
333
        byte[] data = this.toBytearray();
334
        return bytearray_hex(data);
335
    }
336 2252 jjdelcerro
337
    @Override
338
    public void save(File output, String formatName) throws IOException {
339
        ImageIO.write(this.getBufferedImage(), formatName, output);
340
    }
341
342
    @Override
343
    public void save(OutputStream output, String formatName) throws IOException {
344
        ImageIO.write(this.getBufferedImage(), formatName, output);
345
    }
346
347 1840 jjdelcerro
}