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 @ 2017

History | View | Annotate | Download (8.97 KB)

1
package org.gvsig.tools.swing.impl;
2

    
3
import java.awt.Graphics2D;
4
import java.awt.Image;
5
import java.awt.MediaTracker;
6
import java.awt.RenderingHints;
7
import java.awt.geom.AffineTransform;
8
import java.awt.image.BufferedImage;
9
import java.io.ByteArrayInputStream;
10
import java.io.ByteArrayOutputStream;
11
import java.io.File;
12
import java.io.FileInputStream;
13
import java.io.IOException;
14
import java.io.InputStream;
15
import java.net.URL;
16
import java.util.logging.Level;
17
import java.util.logging.Logger;
18
import javax.imageio.ImageIO;
19
import javax.swing.ImageIcon;
20
import org.apache.commons.codec.DecoderException;
21
import org.apache.commons.codec.binary.Base64;
22
import org.apache.commons.codec.binary.Hex;
23
import org.apache.commons.io.IOUtils;
24
import org.gvsig.tools.swing.api.SimpleImage;
25

    
26
/**
27
 *
28
 * @author jjdelcerro
29
 */
30
public class DefaultSimpleImage implements SimpleImage {
31

    
32
    BufferedImage image = null;
33

    
34
    public static BufferedImage toBufferedImage(Image img) {
35
        if (img instanceof BufferedImage) {
36
            return (BufferedImage) img;
37
        }
38
        // Create a buffered image with transparency
39
        BufferedImage bimage = new BufferedImage(
40
                img.getWidth(null), 
41
                img.getHeight(null), 
42
                BufferedImage.TYPE_INT_ARGB
43
        );
44
        // Draw the image on to the buffered image
45
        Graphics2D bGr = bimage.createGraphics();
46
        bGr.drawImage(img, 0, 0, null);
47
        bGr.dispose();
48
        return bimage;
49
    }
50

    
51
    public DefaultSimpleImage() {
52
    }
53

    
54
    public DefaultSimpleImage(BufferedImage image) {
55
        this.image = image;
56
    }
57

    
58
    public DefaultSimpleImage(Object source) {
59
        this.image = this.load(source);
60
    }
61

    
62
    public boolean isEmpty() {
63
        return this.image == null;
64
    }
65

    
66
    public BufferedImage getBufferedImage() {
67
        return this.image;
68
    }
69

    
70
    public void set(BufferedImage image) {
71
        this.image = image;
72
    }
73

    
74
    public void set(Object source) {
75
        this.image = this.load(source);
76
    }
77

    
78
    private BufferedImage load(Object source) {
79
        BufferedImage theImage = null;
80
        try {
81
            if (source instanceof BufferedImage) {
82
                return (BufferedImage) source;
83
                
84
            } else if (source instanceof ImageIcon ) {
85
                ImageIcon icon = (ImageIcon)source;
86
                int loadStatus = icon.getImageLoadStatus();
87
                if( loadStatus != MediaTracker.COMPLETE ) {
88
                    icon.getDescription();
89
                }
90
                return toBufferedImage(icon.getImage());
91
                
92
            } else if (source instanceof Image) {
93
                return toBufferedImage((Image) source);
94
                
95
            } else if (source instanceof byte[]) {
96
                ByteArrayInputStream is = new ByteArrayInputStream((byte[]) source);
97
                theImage = ImageIO.read(is);
98
                
99
            } else if (source instanceof File) {
100
                theImage = ImageIO.read((File) source);
101
                
102
            } else if (source instanceof URL) {
103
                theImage = ImageIO.read((URL) source);
104
                
105
            } else if (source instanceof String) {
106
                InputStream is;
107
                String s = (String) source;
108
                File f = new File(s);
109
                if (f.exists()) {
110
                    is = new FileInputStream(f);
111
                } else {
112
                    try {
113
                        URL url = new URL(s);
114
                        is = url.openStream();
115
                        is.available(); // Force exception if is null
116
                    } catch (Exception ex) {
117
                        try {
118
                            byte[] data = Hex.decodeHex(s.toCharArray());
119
                            is = new ByteArrayInputStream(data);
120
                        } catch (DecoderException ex2) {
121
                            try {
122
                                byte[] data = Base64.decodeBase64(s);
123
                                is = new ByteArrayInputStream(data);
124
                            } catch (Exception ex3) {
125
                                return null;
126
                            }
127
                        }
128
                    }
129
                }
130
                theImage = ImageIO.read(is);
131
                IOUtils.closeQuietly(is);
132
            }
133
        } catch (IOException ex) {
134
            return null;
135
        }
136
        return theImage;
137
    }
138

    
139
    public int getWidth() {
140
        return this.image.getWidth();
141
    }
142

    
143
    public int getHeight() {
144
        return this.image.getHeight();
145
    }
146

    
147
    public DefaultSimpleImage resize(double factor) {
148
        BufferedImage theImage = this.getBufferedImage();
149
        int w = theImage.getWidth();
150
        int h = theImage.getHeight();
151
        int width = (int) (w * factor);
152
        int height = (int) (h * factor);
153
        BufferedImage newImage = new BufferedImage(width, height, theImage.getType());
154
        Graphics2D g = newImage.createGraphics();
155
        g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
156
        g.drawImage(theImage, 0, 0, width, height, 0, 0, w, h, null);
157
        g.dispose();
158
        return new DefaultSimpleImage(newImage);
159
    }
160

    
161
    public DefaultSimpleImage resize(int width, int height) {
162
        BufferedImage theImage = this.getBufferedImage();
163
        int w = theImage.getWidth();
164
        int h = theImage.getHeight();
165
        BufferedImage newImage = new BufferedImage(width, height, theImage.getType());
166
        Graphics2D g = newImage.createGraphics();
167
        g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
168
        g.drawImage(theImage, 0, 0, width, height, 0, 0, w, h, null);
169
        g.dispose();
170
        return new DefaultSimpleImage(newImage);
171
    }
172

    
173
    public DefaultSimpleImage rotate(int angle) {
174
        BufferedImage theImage = this.getBufferedImage();
175
        int w = theImage.getWidth();
176
        int h = theImage.getHeight();
177
        BufferedImage newImage = new BufferedImage(w, h, theImage.getType());
178
        Graphics2D g = newImage.createGraphics();
179
        g.rotate(Math.toRadians(angle), w / 2, h / 2);
180
        g.drawImage(theImage, null, 0, 0);
181
        g.dispose();
182
        return new DefaultSimpleImage(newImage);
183
    }
184

    
185
    public DefaultSimpleImage horizontalflip() {
186
        BufferedImage img = this.getBufferedImage();
187
        int w = img.getWidth();
188
        int h = img.getHeight();
189
        BufferedImage newImage = new BufferedImage(w, h, img.getType());
190
        Graphics2D g = newImage.createGraphics();
191
        g.drawImage(img, 0, 0, w, h, w, 0, 0, h, null);
192
        g.dispose();
193
        return new DefaultSimpleImage(newImage);
194
    }
195

    
196
    public DefaultSimpleImage verticalflip() {
197
        BufferedImage img = this.getBufferedImage();
198
        int w = img.getWidth();
199
        int h = img.getHeight();
200
        BufferedImage newImage = new BufferedImage(w, h, img.getColorModel().getTransparency());
201
        Graphics2D g = newImage.createGraphics();
202
        g.drawImage(img, 0, 0, w, h, 0, h, w, 0, null);
203
        g.dispose();
204
        return new DefaultSimpleImage(newImage);
205
    }
206

    
207
    public DefaultSimpleImage transform(AffineTransform transform, int width, int height) {
208
        BufferedImage img = this.getBufferedImage();
209
        BufferedImage newImage = new BufferedImage(width, height, img.getColorModel().getTransparency());
210
        Graphics2D g = newImage.createGraphics();
211
        g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
212
        g.setTransform(transform);
213
        g.drawImage(img, 0, 0, null);
214
        g.dispose();
215
        return new DefaultSimpleImage(newImage);
216
    }
217

    
218
    public DefaultSimpleImage transform(AffineTransform transform) {
219
        BufferedImage img = this.getBufferedImage();
220
        int w = img.getWidth();
221
        int h = img.getHeight();
222
        BufferedImage newImage = new BufferedImage(w, h, img.getColorModel().getTransparency());
223
        Graphics2D g = newImage.createGraphics();
224
        g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
225
        g.setTransform(transform);
226
        g.drawImage(img, 0, 0, null);
227
        g.dispose();
228
        return new DefaultSimpleImage(newImage);
229
    }
230

    
231
    private String bytearray_hex(byte[] data) {
232
        StringBuilder builder = new StringBuilder();
233
        for (byte abyte : data) {
234
            int v = abyte & 0xff;
235
            builder.append(String.format("%02x", v));
236
        }
237
        return builder.toString();
238
    }
239
    
240
    @Override
241
    public byte[] toBytearray() {
242
        try {
243
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
244
            ImageIO.write( this.image, "png", baos );
245
            baos.flush();
246
            byte[] imageInByte = baos.toByteArray();        
247
            baos.close();
248
            return imageInByte;
249
        } catch (IOException ex) {
250
            return null;
251
        }
252
    }
253
    
254
    @Override
255
    public String toString() {
256
        byte[] data = this.toBytearray();
257
        return bytearray_hex(data);
258
    }
259
}