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

View differences:

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