001 // $HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/branches/2.2_testing/src/org/deegree/framework/util/ImageUtils.java $ 002 /*---------------- FILE HEADER ------------------------------------------ 003 004 This file is part of deegree. 005 Copyright (C) 2001-2008 by: 006 EXSE, Department of Geography, University of Bonn 007 http://www.giub.uni-bonn.de/deegree/ 008 lat/lon GmbH 009 http://www.lat-lon.de 010 011 This library is free software; you can redistribute it and/or 012 modify it under the terms of the GNU Lesser General Public 013 License as published by the Free Software Foundation; either 014 version 2.1 of the License, or (at your option) any later version. 015 016 This library is distributed in the hope that it will be useful, 017 but WITHOUT ANY WARRANTY; without even the implied warranty of 018 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 019 Lesser General Public License for more details. 020 021 You should have received a copy of the GNU Lesser General Public 022 License along with this library; if not, write to the Free Software 023 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 024 025 Contact: 026 027 Andreas Poth 028 lat/lon GmbH 029 Aennchenstr. 19 030 53115 Bonn 031 Germany 032 E-Mail: poth@lat-lon.de 033 034 Prof. Dr. Klaus Greve 035 Department of Geography 036 University of Bonn 037 Meckenheimer Allee 166 038 53115 Bonn 039 Germany 040 E-Mail: greve@giub.uni-bonn.de 041 042 043 ---------------------------------------------------------------------------*/ 044 package org.deegree.framework.util; 045 046 import static org.deegree.enterprise.WebUtils.enableProxyUsage; 047 048 import java.awt.image.BufferedImage; 049 import java.io.File; 050 import java.io.FileOutputStream; 051 import java.io.IOException; 052 import java.io.InputStream; 053 import java.io.OutputStream; 054 import java.net.URL; 055 056 import javax.imageio.ImageIO; 057 import javax.media.jai.JAI; 058 import javax.media.jai.RenderedOp; 059 060 import org.apache.batik.ext.awt.image.codec.ImageDecoderImpl; 061 import org.apache.batik.ext.awt.image.codec.PNGDecodeParam; 062 import org.apache.batik.ext.awt.image.codec.PNGImageDecoder; 063 import org.apache.batik.ext.awt.image.codec.tiff.TIFFDecodeParam; 064 import org.apache.batik.ext.awt.image.codec.tiff.TIFFImage; 065 import org.apache.commons.httpclient.HttpClient; 066 import org.apache.commons.httpclient.methods.GetMethod; 067 068 import Acme.JPM.Encoders.GifEncoder; 069 070 import com.sun.image.codec.jpeg.JPEGCodec; 071 import com.sun.image.codec.jpeg.JPEGImageEncoder; 072 import com.sun.media.jai.codec.BMPEncodeParam; 073 import com.sun.media.jai.codec.ImageCodec; 074 import com.sun.media.jai.codec.MemoryCacheSeekableStream; 075 import com.sun.media.jai.codec.PNGEncodeParam; 076 import com.sun.media.jai.codec.SeekableStream; 077 import com.sun.media.jai.codec.TIFFEncodeParam; 078 079 /** 080 * Some util methods for reading standard images 081 * 082 * @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a> 083 * @author last edited by: $Author: aschmitz $ 084 * 085 * @version $Revision: 12685 $, $Date: 2008-07-07 10:01:54 +0200 (Mo, 07 Jul 2008) $ 086 */ 087 public class ImageUtils { 088 089 /** 090 * reads an image from the passed <tt>URL</tt> using JAI mechanism 091 * 092 * @param url 093 * address of the image 094 * 095 * @return read image 096 * 097 * @throws IOException 098 */ 099 public static BufferedImage loadImage( URL url ) 100 throws IOException { 101 if ( url.toExternalForm().startsWith( "file" ) ) { 102 return loadImage( url.openStream() ); 103 } 104 105 String uri = url.toExternalForm(); 106 HttpClient httpclient = new HttpClient(); 107 enableProxyUsage( httpclient, url ); 108 httpclient.getHttpConnectionManager().getParams().setSoTimeout( 25000 ); 109 GetMethod httpget = new GetMethod( uri ); 110 httpclient.executeMethod( httpget ); 111 return loadImage( httpget.getResponseBodyAsStream() ); 112 113 } 114 115 // TODO check url-@param Tag 116 /** 117 * reads an image from the passed <tt>InputStream</tt> using JAI mechanism 118 * 119 * @param is 120 * @param url 121 * address of the image 122 * 123 * @return read image 124 * 125 * @throws IOException 126 */ 127 public static BufferedImage loadImage( InputStream is ) 128 throws IOException { 129 SeekableStream fss = new MemoryCacheSeekableStream( is ); 130 RenderedOp ro = JAI.create( "stream", fss ); 131 BufferedImage img = ro.getAsBufferedImage(); 132 fss.close(); 133 is.close(); 134 return img; 135 } 136 137 /** 138 * reads an image from the passed file location using JAI mechanism 139 * 140 * @param fileName 141 * 142 * @return read imagey 143 * 144 * @throws IOException 145 */ 146 public static BufferedImage loadImage( String fileName ) 147 throws IOException { 148 return loadImage( new File( fileName ) ); 149 } 150 151 /** 152 * reads an image from the passed file location using JAI mechanism 153 * 154 * @param file 155 * 156 * @return read imagey 157 * 158 * @throws IOException 159 */ 160 public static BufferedImage loadImage( File file ) 161 throws IOException { 162 163 BufferedImage img = null; 164 String tmp = file.getName().toLowerCase(); 165 if ( tmp.endsWith( ".tif" ) || tmp.endsWith( ".tiff" ) ) { 166 InputStream is = file.toURL().openStream(); 167 org.apache.batik.ext.awt.image.codec.SeekableStream fss = new org.apache.batik.ext.awt.image.codec.MemoryCacheSeekableStream( 168 is ); 169 TIFFImage tiff = new TIFFImage( fss, new TIFFDecodeParam(), 0 ); 170 img = RenderedOp.wrapRenderedImage( tiff ).getAsBufferedImage(); 171 fss.close(); 172 } else if ( tmp.endsWith( ".png" ) ) { 173 InputStream is = file.toURL().openStream(); 174 ImageDecoderImpl dec = new PNGImageDecoder( is, new PNGDecodeParam() ); 175 img = RenderedOp.wrapRenderedImage( dec.decodeAsRenderedImage() ).getAsBufferedImage(); 176 is.close(); 177 } else { 178 img = ImageIO.read( file ); 179 } 180 181 return img; 182 } 183 184 /** 185 * stores the passed image in the passed file name with defined quality 186 * 187 * @param image 188 * @param fileName 189 * @param quality 190 * just supported for jpeg (0..1) 191 * @throws IOException 192 */ 193 public static void saveImage( BufferedImage image, String fileName, float quality ) 194 throws IOException { 195 File file = new File( fileName ); 196 saveImage( image, file, quality ); 197 } 198 199 /** 200 * stores the passed image in the passed file with defined quality 201 * 202 * @param image 203 * @param file 204 * @param quality 205 * just supported for jpeg (0..1) 206 * @throws IOException 207 */ 208 public static void saveImage( BufferedImage image, File file, float quality ) 209 throws IOException { 210 int pos = file.getName().lastIndexOf( '.' ); 211 String ext = file.getName().substring( pos + 1, file.getName().length() ).toLowerCase(); 212 213 FileOutputStream fos = new FileOutputStream( file ); 214 saveImage( image, fos, ext, quality ); 215 216 } 217 218 /** 219 * write an image into the passed output stream. after writing the image the stream will be closed. 220 * 221 * @param image 222 * @param os 223 * @param format 224 * @param quality 225 * @throws IOException 226 */ 227 public static void saveImage( BufferedImage image, OutputStream os, String format, float quality ) 228 throws IOException { 229 try { 230 231 if ( "jpeg".equalsIgnoreCase( format ) || "jpg".equalsIgnoreCase( format ) ) { 232 encodeJpeg( os, image, quality ); 233 } else if ( "tif".equalsIgnoreCase( format ) || "tiff".equalsIgnoreCase( format ) ) { 234 encodeTiff( os, image ); 235 } else if ( "png".equalsIgnoreCase( format ) ) { 236 encodePng( os, image ); 237 } else if ( "gif".equalsIgnoreCase( format ) ) { 238 encodeGif( os, image ); 239 } else if ( "bmp".equalsIgnoreCase( format ) ) { 240 encodeBmp( os, image ); 241 } else { 242 throw new IOException( "invalid image format: " + format ); 243 } 244 } catch ( IOException e ) { 245 throw e; 246 } finally { 247 os.close(); 248 } 249 250 } 251 252 /** 253 * 254 * 255 * @param out 256 * @param img 257 * 258 * @throws IOException 259 */ 260 public static synchronized void encodeGif( OutputStream out, BufferedImage img ) 261 throws IOException { 262 GifEncoder encoder = new GifEncoder( img, out ); 263 encoder.encode(); 264 } 265 266 /** 267 * 268 * 269 * @param out 270 * @param img 271 * 272 * @throws IOException 273 */ 274 private static synchronized void encodeBmp( OutputStream out, BufferedImage img ) 275 throws IOException { 276 BMPEncodeParam encodeParam = new BMPEncodeParam(); 277 278 com.sun.media.jai.codec.ImageEncoder encoder = ImageCodec.createImageEncoder( "BMP", out, encodeParam ); 279 280 encoder.encode( img ); 281 } 282 283 /** 284 * 285 * 286 * @param out 287 * @param img 288 * 289 * @throws IOException 290 */ 291 private static synchronized void encodePng( OutputStream out, BufferedImage img ) 292 throws IOException { 293 PNGEncodeParam encodeParam = PNGEncodeParam.getDefaultEncodeParam( img ); 294 295 if ( encodeParam instanceof PNGEncodeParam.Palette ) { 296 PNGEncodeParam.Palette p = (PNGEncodeParam.Palette) encodeParam; 297 byte[] b = new byte[] { -127 }; 298 p.setPaletteTransparency( b ); 299 } 300 301 com.sun.media.jai.codec.ImageEncoder encoder = ImageCodec.createImageEncoder( "PNG", out, encodeParam ); 302 encoder.encode( img.getData(), img.getColorModel() ); 303 } 304 305 /** 306 * 307 * 308 * @param out 309 * @param img 310 * 311 * @throws IOException 312 */ 313 private static synchronized void encodeTiff( OutputStream out, BufferedImage img ) 314 throws IOException { 315 TIFFEncodeParam encodeParam = new TIFFEncodeParam(); 316 317 com.sun.media.jai.codec.ImageEncoder encoder = ImageCodec.createImageEncoder( "TIFF", out, encodeParam ); 318 319 encoder.encode( img ); 320 } 321 322 /** 323 * 324 * 325 * @param out 326 * @param img 327 * @param quality 328 * 329 * @throws IOException 330 */ 331 private static synchronized void encodeJpeg( OutputStream out, BufferedImage img, float quality ) 332 throws IOException { 333 334 // encode JPEG 335 JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder( out ); 336 com.sun.image.codec.jpeg.JPEGEncodeParam jpegParams = encoder.getDefaultJPEGEncodeParam( img ); 337 jpegParams.setQuality( quality, false ); 338 encoder.setJPEGEncodeParam( jpegParams ); 339 340 encoder.encode( img ); 341 } 342 343 }