001 //$HeadURL: svn+ssh://jwilden@svn.wald.intevation.org/deegree/base/branches/2.5_testing/src/org/deegree/tools/legend/LegendElementCreator.java $ 002 /*---------------------------------------------------------------------------- 003 This file is part of deegree, http://deegree.org/ 004 Copyright (C) 2001-2009 by: 005 Department of Geography, University of Bonn 006 and 007 lat/lon GmbH 008 009 This library is free software; you can redistribute it and/or modify it under 010 the terms of the GNU Lesser General Public License as published by the Free 011 Software Foundation; either version 2.1 of the License, or (at your option) 012 any later version. 013 This library is distributed in the hope that it will be useful, but WITHOUT 014 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 015 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more 016 details. 017 You should have received a copy of the GNU Lesser General Public License 018 along with this library; if not, write to the Free Software Foundation, Inc., 019 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 020 021 Contact information: 022 023 lat/lon GmbH 024 Aennchenstr. 19, 53177 Bonn 025 Germany 026 http://lat-lon.de/ 027 028 Department of Geography, University of Bonn 029 Prof. Dr. Klaus Greve 030 Postfach 1147, 53001 Bonn 031 Germany 032 http://www.geographie.uni-bonn.de/deegree/ 033 034 e-mail: info@deegree.org 035 ----------------------------------------------------------------------------*/ 036 037 package org.deegree.tools.legend; 038 039 import java.awt.Color; 040 import java.awt.Graphics; 041 import java.awt.image.BufferedImage; 042 import java.io.File; 043 import java.io.FileOutputStream; 044 import java.io.IOException; 045 import java.util.HashMap; 046 import java.util.Iterator; 047 import java.util.Map; 048 049 import org.deegree.framework.log.ILogger; 050 import org.deegree.framework.log.LoggerFactory; 051 import org.deegree.framework.util.ImageUtils; 052 import org.deegree.framework.util.MimeTypeMapper; 053 import org.deegree.framework.xml.XMLParsingException; 054 import org.deegree.graphics.legend.LegendElement; 055 import org.deegree.graphics.legend.LegendException; 056 import org.deegree.graphics.legend.LegendFactory; 057 import org.deegree.graphics.sld.AbstractStyle; 058 import org.deegree.graphics.sld.NamedLayer; 059 import org.deegree.graphics.sld.SLDFactory; 060 import org.deegree.graphics.sld.StyledLayerDescriptor; 061 import org.deegree.graphics.sld.UserLayer; 062 import org.deegree.graphics.sld.UserStyle; 063 064 /** 065 * This executable class is an application, which reads out an sld-document, creates the 066 * corresponding legend-elements and saves them as an image. The class can be executed from the 067 * console. 068 * 069 * 070 * @author <a href="schaefer@lat-lon.de">Axel Schaefer</a> 071 * @author last edited by: $Author: mschneider $ 072 * 073 * @version $Revision: 18195 $, $Date: 2009-06-18 17:55:39 +0200 (Do, 18 Jun 2009) $ 074 */ 075 public class LegendElementCreator { 076 077 private static final ILogger LOG = LoggerFactory.getLogger( LegendElementCreator.class ); 078 079 String verbose_output = ""; 080 081 LecGUI lecgui = null; 082 083 /** 084 * @param sldfile 085 * @param directory 086 * @param format 087 * @param color 088 * @param width 089 * @param height 090 * @param title 091 * @param lec 092 * @throws LegendException 093 * 094 */ 095 public LegendElementCreator( String sldfile, String directory, String format, Color color, int width, int height, 096 String title, LecGUI lec ) throws LegendException { 097 098 this.lecgui = lec; 099 100 StringBuffer sb = new StringBuffer( 100 ); 101 102 // read out the SLD 103 HashMap stylemap = null; 104 try { 105 stylemap = loadSLD( sldfile ); 106 } catch ( IOException ioe ) { 107 throw new LegendException( "An error (IOException) occured in processing the SLD-File:\n" + sldfile + "\n" 108 + ioe ); 109 } catch ( XMLParsingException xmlpe ) { 110 throw new LegendException( "An error (XMLParsingException) occured in parsing " + "the SLD-File:\n" 111 + sldfile + "\n" + xmlpe.getMessage() ); 112 } 113 114 // output 115 LegendFactory lf = new LegendFactory(); 116 LegendElement le = null; 117 BufferedImage buffi = null; 118 119 Iterator iterator = stylemap.entrySet().iterator(); 120 String filename = null; 121 AbstractStyle style = null; 122 int i = 0; 123 while ( iterator.hasNext() ) { 124 i++; 125 Map.Entry entry = (Map.Entry) iterator.next(); 126 filename = ( (String) entry.getKey() ).replace( ':', '_' ); 127 style = (AbstractStyle) entry.getValue(); 128 129 try { 130 le = lf.createLegendElement( style, width, height, title ); 131 buffi = le.exportAsImage( MimeTypeMapper.toMimeType( format ) ); 132 saveImage( buffi, directory, filename, format, color ); 133 sb.append( "- Image " + filename + "." + format + " in " + directory + " saved.\n" ); 134 } catch ( LegendException lex ) { 135 throw new LegendException( "An error (LegendException) occured during the creating\n" 136 + "of the LegendElement " + filename + ":\n" + lex ); 137 } catch ( IOException ioex ) { 138 throw new LegendException( "An error (IOException) occured during the creating/saving\n" 139 + "of the output-image " + filename + ":\n" + ioex ); 140 } catch ( Exception ex ) { 141 throw new LegendException( "A general error (Exception) occured during the creating/saving\n" 142 + "of the output-image " + filename + ":\n" + ex ); 143 } 144 145 } 146 setVerboseOutput( sb.toString() ); 147 } 148 149 /** 150 * 151 * @return verbose_output 152 */ 153 public String getVerboseOutput() { 154 return this.verbose_output; 155 } 156 157 /** 158 * @param vo 159 */ 160 public void setVerboseOutput( String vo ) { 161 if ( vo != null ) { 162 this.verbose_output = vo; 163 } 164 } 165 166 /** 167 * loads the sld-document, parses it an returns a HashMap containing the different styles. 168 * 169 * @param sldFile 170 * the file containing the StyledLayerDescriptor 171 * @return HashMap containing the styles of the SLD. 172 * @throws IOException 173 * if the SLD-document cant be read/found in the filesystem 174 * @throws XMLParsingException 175 * if an error occurs during the parsing of the sld-document 176 */ 177 static private HashMap loadSLD( String sldFile ) 178 throws IOException, XMLParsingException { 179 AbstractStyle[] styles = null; 180 181 File file = new File( sldFile ); 182 StyledLayerDescriptor sld = SLDFactory.createSLD( file.toURL() ); 183 184 HashMap<String, AbstractStyle> map = new HashMap<String, AbstractStyle>(); 185 186 // NAMED LAYER 187 NamedLayer[] namedlayers = sld.getNamedLayers(); 188 for ( int i = 0; i < namedlayers.length; i++ ) { 189 styles = namedlayers[i].getStyles(); 190 for ( int j = 0; j < styles.length; j++ ) { 191 if ( styles[j] instanceof UserStyle ) { 192 map.put( styles[j].getName(), styles[j] ); 193 } 194 } 195 } 196 197 // USER LAYER 198 UserLayer[] userLayers = sld.getUserLayers(); 199 for ( int k = 0; k < userLayers.length; k++ ) { 200 styles = userLayers[k].getStyles(); 201 for ( int l = 0; l < styles.length; l++ ) { 202 if ( styles[l] instanceof UserStyle ) { 203 map.put( styles[l].getName(), styles[l] ); 204 } 205 } 206 } 207 return map; 208 } 209 210 /** 211 * saves the resulting buffered Image from org.deegree.graphics.legend as an image. 212 * 213 * @param bi 214 * the BufferedImage from org.deegree.graphics.legend.* 215 * @param outdir 216 * the output-directory (application-parameter) 217 * @param filename 218 * the output-filename (from the styles of the SLD) 219 * @param graphicsformat 220 * the output-graphicsformat (application-parameter) 221 * @throws IOException 222 * if saving fails. 223 * @throws Exception 224 * if the graphic-encoder can't be found. 225 */ 226 private void saveImage( BufferedImage bi, String outdir, String filename, String graphicsformat, Color color ) 227 throws LegendException, IOException, Exception { 228 229 File file = new File( outdir, filename + "." + graphicsformat ); 230 FileOutputStream fos = new FileOutputStream( file ); 231 232 // PNG 233 if ( graphicsformat.equalsIgnoreCase( "PNG" ) ) { 234 235 BufferedImage outbi = new BufferedImage( bi.getWidth(), bi.getHeight(), BufferedImage.TYPE_INT_ARGB ); 236 Graphics g = outbi.getGraphics(); 237 g.drawImage( bi, 0, 0, color, null ); 238 ImageUtils.saveImage( outbi, fos, "png", 1 ); 239 // BMP 240 } else if ( graphicsformat.equalsIgnoreCase( "BMP" ) ) { 241 BufferedImage outbi = new BufferedImage( bi.getWidth(), bi.getHeight(), BufferedImage.TYPE_3BYTE_BGR ); 242 243 Graphics g = outbi.getGraphics(); 244 // transparency 245 if ( color == null ) { 246 this.lecgui.addDebugInformation( "BMP-NOTIFY:\n" 247 + "Requested transparency (transp.) isn't available for BMP-images.\n" 248 + "Using default background color WHITE.\n" ); 249 color = Color.WHITE; 250 } 251 g.drawImage( bi, 0, 0, color, null ); 252 ImageUtils.saveImage( outbi, fos, "bmp", 1 ); 253 // GIF 254 } else if ( graphicsformat.equalsIgnoreCase( "GIF" ) ) { 255 BufferedImage outbi = new BufferedImage( bi.getWidth(), bi.getHeight(), BufferedImage.TYPE_INT_ARGB ); 256 Graphics g = outbi.getGraphics(); 257 g.drawImage( bi, 0, 0, color, null ); 258 ImageUtils.saveImage( outbi, fos, "gif", 1 ); 259 // JPEG 260 } else if ( graphicsformat.equalsIgnoreCase( "JPEG" ) || graphicsformat.equalsIgnoreCase( "JPG" ) ) { 261 BufferedImage outbi = new BufferedImage( bi.getWidth(), bi.getHeight(), BufferedImage.TYPE_INT_RGB ); 262 Graphics g = outbi.getGraphics(); 263 264 // transparency 265 if ( color == null ) { 266 this.lecgui.addDebugInformation( "JPEG-NOTIFY:\n" 267 + "Requested transparency (transp.) isn't available for JPG-images.\n" 268 + "Using default background color WHITE.\n" ); 269 color = Color.WHITE; 270 } 271 272 g.drawImage( bi, 0, 0, color, null ); 273 ImageUtils.saveImage( outbi, fos, "jpeg", 1 ); 274 // TIFF 275 } else if ( graphicsformat.equalsIgnoreCase( "TIFF" ) || graphicsformat.equalsIgnoreCase( "TIF" ) ) { 276 BufferedImage outbi = new BufferedImage( bi.getWidth(), bi.getHeight(), BufferedImage.TYPE_BYTE_BINARY ); 277 Graphics g = outbi.getGraphics(); 278 g.drawImage( bi, 0, 0, color, null ); 279 ImageUtils.saveImage( outbi, fos, "tif", 1 ); 280 } else { 281 throw new Exception( "Can't save output image because no graphic-encoder found for:\n" + "filetype: '" 282 + graphicsformat + "' for file: '" + file + "'" ); 283 } 284 LOG.logInfo( "-- " + file + " saved." ); 285 } 286 287 /** 288 * main-method for testing purposes 289 * 290 * @param args 291 */ 292 public static void main( String[] args ) { 293 294 String sldfile = args[0]; 295 String directory = args[1]; 296 String format = "PNG"; 297 Color color = Color.WHITE; 298 int width = 40; 299 int height = 40; 300 String title = "Mein Titel Platzhalter Texttexttext"; 301 LecGUI lec = null; 302 303 try { 304 new LegendElementCreator( sldfile, directory, format, color, width, height, title, lec ); 305 } catch ( LegendException e ) { 306 e.printStackTrace(); 307 } 308 309 LOG.logInfo( "...finished" ); 310 } 311 312 }