Mir goes GPL
[mir.git] / jmagick / WebdbImage.java.jmagick
1 /*
2  * Copyright (C) 2001  The Mir-coders group
3  *
4  * This file is part of Mir.
5  *
6  * Mir is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * Mir is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with Mir; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  *
20  * In addition, as a special exception, The Mir-coders gives permission to link
21  * the code of this program with the com.oreilly.servlet library, any library
22  * licensed under the Apache Software License, The Sun (tm) Java Advanced
23  * Imaging library (JAI), The Sun JIMI library (or with modified versions of
24  * the above that use the same license as the above), and distribute linked
25  * combinations including the two.  You must obey the GNU General Public
26  * License in all respects for all of the code used other than the above
27  * mentioned libraries.  If you modify this file, you may extend this exception
28  * to your version of the file, but you are not obligated to do so.  If you do
29  * not wish to do so, delete this exception statement from your version.
30  */
31
32 package mir.misc;
33
34 /**
35  * Title:
36  * Description:
37  * Copyright:    Copyright (c) 2001
38  * Company:      Indymedia
39  * @author
40  * @version 1.0
41  */
42
43 import java.io.*;
44 //import java.awt.image.renderable.ParameterBlock;
45 import java.awt.Dimension;
46 import java.awt.Rectangle;
47 import magick.*;
48
49 public class WebdbImage
50 {
51
52     private Logfile theLog = Logfile.getInstance(MirConfig.getPropWithHome("HTMLTemplateProcessor.Logfile"));
53         // imageTypes
54         public final static int        WEBDB_JPG=0;
55         public final static int        WEBDB_GIF=1;
56
57         // default values for scaling
58         private int               maxIconSize=120;
59         private int               maxImageSize=640;
60
61         private byte[]            iconData;
62         private byte[]            imageData;
63         private int               imageType;
64         private int               iconWidth;
65         private int               iconHeight;
66
67         // internal representation of the image
68         private MagickImage       magickImage;
69
70
71         // constructor
72         public WebdbImage(byte[] image, int type)
73                 throws IOException
74         {
75                 imageType=type;
76         try {
77             magickImage = new MagickImage(new ImageInfo(), image);
78         } catch (MagickException e) {theLog.printDebugInfo("fail: "+e.toString());}
79                 scaleImage();
80         }
81
82         public WebdbImage(byte[] image, int type, int iconMax)
83                 throws IOException
84         {
85                 imageType=type;
86                 maxIconSize=iconMax;
87         try {
88             magickImage = new MagickImage(new ImageInfo(), image);
89         } catch (MagickException e) {theLog.printDebugInfo("fail: "+e.toString());}
90                 scaleImage();
91         }
92
93         public WebdbImage(byte[] image, int type, int iconMax, int imageMax)
94                 throws IOException
95         {
96                 imageType=type;
97                 maxIconSize=iconMax;
98                 maxImageSize=imageMax;
99         try {
100             magickImage = new MagickImage(new ImageInfo(), image);
101         } catch (MagickException e) {theLog.printDebugInfo("fail: "+e.toString());}
102                 scaleImage();
103         }
104
105
106         // acc3ssor-methods
107         public int getIconWidth() throws IOException {
108                 if (iconData==null) scaleIcon();
109                 return iconWidth;
110         }
111
112         public int getIconHeight() throws IOException {
113                 if (iconData==null) scaleIcon();
114                 return iconHeight;
115         }
116
117         public int getImageWidth() {
118         try {
119             return (int)magickImage.getDimension().getWidth();
120         } catch (MagickException e) { return -1;}
121         }
122
123         public int getImageHeight() {
124         int gg;
125         try {
126                     return (int)magickImage.getDimension().getHeight();
127         } catch (MagickException e) { return -1;}
128         }
129
130         public byte[] getImage() {
131                 if (imageData==null) {
132             try {
133                 ImageInfo imageInfo = new ImageInfo();
134                 imageInfo.init();
135
136                 switch (imageType) {
137                     case WEBDB_JPG:
138                         imageInfo.setMagickMember("JPG");
139                     case WEBDB_GIF:
140                         imageInfo.setMagickMember("JPG");
141                 }
142
143                 imageData = magickImage.imageToBlob(imageInfo);
144             } catch (MagickException e) {
145                 theLog.printDebugInfo("getImage: magick "+e.toString());
146             }
147         }
148         return imageData;
149         }
150
151         public byte[] getIcon()
152                 throws IOException
153         {
154                 if (iconData == null) scaleIcon();
155                 return iconData;
156         }
157
158         private void scaleImage()
159                 throws java.io.IOException
160         {
161                 if (maxImageSize>0 && ( getImageHeight()> maxImageSize|| getImageWidth() >maxImageSize))
162                 {
163                         float scale;
164                         if (getImageHeight() > getImageWidth())
165                                 scale = (float)maxImageSize / (float)getImageHeight();
166                         else
167                                 scale = (float)maxImageSize / (float)getImageWidth();
168
169             try {
170                             magickImage = magickImage.scaleImage((int)scale*getImageWidth(), (int)scale*getImageHeight());
171             } catch (MagickException e) {}
172                 }
173         }
174
175         private void scaleIcon()
176                 throws java.io.IOException
177         {
178                 if (iconData==null) {
179                         float scale;
180                         if (getImageHeight() > getImageWidth())
181                                 scale = (float)maxIconSize / (float)getImageHeight();
182                         else
183                                 scale = (float)maxIconSize / (float)getImageWidth();
184
185             try {
186                             MagickImage temp = magickImage.scaleImage((int)(scale*getImageWidth()), (int)(scale*getImageHeight()));
187                 ImageInfo imageInfo = new ImageInfo();
188                 imageInfo.init();
189                 /** @todo gif */
190                 switch (imageType) {
191                     case WEBDB_JPG:
192                         imageInfo.setMagickMember("JPG");
193                     case WEBDB_GIF:
194                         imageInfo.setMagickMember("JPG");
195                 }
196                 iconWidth=(int)temp.getDimension().getWidth();
197                 iconHeight=(int)temp.getDimension().getHeight();
198                 // Put a black rectangle around the border
199                 DrawInfo drawInfo = new DrawInfo(imageInfo);
200                 drawInfo.setPrimitive("Rectangle 0 0 "+(iconWidth-1)+" "+(iconHeight-1));
201                 drawInfo.setStroke(PixelPacket.queryColorDatabase("black"));
202                 temp.drawImage(drawInfo);
203                 iconData = temp.imageToBlob(imageInfo);
204             } catch (MagickException e) {}
205                 }
206         }
207
208 }