001 //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/tags/2.1/src/org/deegree/ogcwebservices/wpvs/utils/ImageUtils.java $ 002 /*---------------- FILE HEADER ------------------------------------------ 003 004 This file is part of deegree. 005 Copyright (C) 2001-2006 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 Aennchenstraße 19 030 53177 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.ogcwebservices.wpvs.utils; 045 046 import java.awt.Color; 047 import java.awt.Graphics; 048 import java.awt.Image; 049 import java.awt.image.BufferedImage; 050 import java.awt.image.FilteredImageSource; 051 import java.awt.image.ImageFilter; 052 import java.awt.image.ImageProducer; 053 import java.awt.image.RGBImageFilter; 054 055 /** 056 * Little utility class responsible for filtering an image and making it 057 * transparent based on an array of colors considered to be transparent. 058 * Users of this class initalize an object with a non-null <code>Color</code> array 059 * that represents colors, which are supposed to be completely transparent. 060 * By calling <code>#filter( Image )</code>, the colors found in image are substituted 061 * by transparent pixels. 062 * 063 * @author <a href="mailto:taddei@lat-lon.de">Ugo Taddei</a> 064 * @author last edited by: $Author: bezema $ 065 * 066 * $Revision: 6259 $, $Date: 2007-03-20 10:15:15 +0100 (Di, 20 Mär 2007) $ 067 */ 068 public class ImageUtils { 069 070 071 private ImageFilter filter; 072 073 /** 074 * Creates a new <code>ImageUtil</code> object. 075 * @param transparentColors the colors that will be substituted by a completely 076 * transparent color ('0x00FFFFFF'). transparentColors cannot be null. 077 */ 078 public ImageUtils( Color[] transparentColors ){ 079 080 if ( transparentColors == null ){ 081 throw new NullPointerException( "transparentColors cannot be null!" ); 082 } 083 084 int[] intColors = new int[ transparentColors.length ]; 085 for ( int j = 0; j < intColors.length; j++ ) { 086 intColors[j] = transparentColors[j].getRGB(); 087 } 088 filter = new ImageUtils.ColorsToTransparentFilter( intColors ); 089 090 } 091 092 /** 093 * Creates a Imagefilter which makes an image transparent. 094 */ 095 public ImageUtils( ){ 096 filter = new ImageUtils.TransparentImageFilter(); 097 098 } 099 100 /** 101 * Filters an image and return a new partially transparent image. 102 * @param image the image that is to be filtered. 103 * @return a new image whose colors are substituted accordign to the 104 * input traparent colors. The input image cannot be null. 105 */ 106 public Image filterImage( BufferedImage image ){ 107 108 if ( image == null ){ 109 throw new NullPointerException( "Image cannot be null!" ); 110 } 111 image = ensureRGBAImage( image ); 112 ImageProducer imgProducer = 113 new FilteredImageSource( image.getSource(), filter ); 114 115 return java.awt.Toolkit.getDefaultToolkit().createImage( imgProducer ); 116 } 117 118 /** 119 * Checks if the type of <code>img</code> is <code>BufferedImage.TYPE_INT_ARGB</code> 120 * and if is not, create a new one, just like <code>img</code> but with transparency 121 * @param image the image to be checked. Cannot be null. 122 * @return the same image, if its type is <code>BufferedImage.TYPE_INT_ARGB</code>, or a 123 * new transparent one. 124 */ 125 public BufferedImage ensureRGBAImage( BufferedImage image ) { 126 127 if ( image == null ){ 128 throw new NullPointerException( "Image cannot be null!" ); 129 } 130 131 if ( image.getType() != BufferedImage.TYPE_INT_ARGB ) { 132 BufferedImage tmp = new BufferedImage( image.getWidth(), image.getHeight(), 133 BufferedImage.TYPE_INT_ARGB ); 134 Graphics g = tmp.getGraphics(); 135 g.drawImage( image, 0, 0, null ); 136 g.dispose(); 137 image = tmp; 138 } 139 return image; 140 } 141 142 /** 143 * An <code>RGBImageFilter</code> to substitute all input colors by a completely 144 * transparent one. 145 * 146 * @author <a href="mailto:taddei@lat-lon.de">Ugo Taddei</a> 147 * @author last edited by: $Author: bezema $ 148 * 149 * $Revision: 6259 $, $Date: 2007-03-20 10:15:15 +0100 (Di, 20 Mär 2007) $ 150 */ 151 public class ColorsToTransparentFilter extends RGBImageFilter { 152 153 private static final int TRANSPARENT_COLOR = 0x00FFFFFF; 154 155 private final int[] colors; 156 157 float alphaPercent = 0.975f; 158 159 /** 160 * @param colors the Colors which should be transparent 161 */ 162 public ColorsToTransparentFilter( int[] colors ) { 163 if ( colors == null || colors.length == 0){ 164 throw new NullPointerException( "colors cannot be null!" ); 165 } 166 this.colors = colors; 167 canFilterIndexColorModel = true; 168 } 169 170 /** 171 * @see java.awt.image.RGBImageFilter 172 */ 173 @Override 174 public int filterRGB(int x, int y, int argb) { 175 if( shouldBeTransparent( argb ) ) { 176 return TRANSPARENT_COLOR; // mask alpha bits to zero 177 // argb = TRANSPARENT_COLOR; 178 } 179 return argb; 180 /*int a = ( argb >> 24) & 0xff; 181 a *= alphaPercent; 182 return ( ( argb & 0x00ffffff) | (a << 24));*/ 183 } 184 185 /** 186 * Compares <code>color</code> with TRANSPARENT_COLOR 187 * @param color color to be compared to TRANSPARENT_COLOR 188 * @return true if color = TRANSPARENT_COLOR 189 */ 190 private boolean shouldBeTransparent( int color ) { 191 for ( int i = 0; i < colors.length; i++ ) { 192 if ( colors[i] == color ) { 193 return true; 194 } 195 } 196 return false; 197 } 198 } 199 200 /* from Java AWT reference, chap. 12*/ 201 /** 202 * The <code>TransparentImageFilter</code> class filters an RGB-Pixel with a transparency. 203 * 204 * @author <a href="mailto:taddei@lat-lon.de">Ugo Taddei</a> 205 * 206 * @author last edited by: $Author: bezema $ 207 * 208 * @version $Revision: 6259 $, $Date: 2007-03-20 10:15:15 +0100 (Di, 20 Mär 2007) $ 209 * 210 */ 211 class TransparentImageFilter extends RGBImageFilter { 212 float alphaPercent; 213 /** 214 * A TransparentImageFilter with no transparency 215 */ 216 public TransparentImageFilter () { 217 this (1f); 218 } 219 /** 220 * @param aPercent of the transparency 221 */ 222 public TransparentImageFilter (float aPercent) { 223 if ((aPercent < 0.0) || (aPercent > 1.0)) 224 aPercent = 1; 225 alphaPercent = aPercent; 226 canFilterIndexColorModel = true; 227 } 228 @Override 229 public int filterRGB (int x, int y, int rgb) { 230 int a = (rgb >> 24) & 0xff; 231 a *= alphaPercent; 232 233 return ((rgb & 0x00ffffff) | (a << 24)); 234 } 235 } 236 } 237 238 239 /* ******************************************************************** 240 Changes to this class. What the people have been up to: 241 $Log$ 242 Revision 1.1 2006/12/06 15:11:24 bezema 243 renamed the wpvs.util package into wpvs.utils, removed not used classes and moved SunPosition SUnLight in the util package 244 245 Revision 1.1 2006/10/17 20:31:18 poth 246 *** empty log message *** 247 248 Revision 1.9 2006/06/29 19:07:09 poth 249 bug fix 250 251 Revision 1.8 2006/06/20 10:16:01 taddei 252 clean up and javadoc 253 254 Revision 1.7 2006/05/10 15:02:41 taddei 255 increased transparency 256 257 Revision 1.6 2006/04/06 20:25:25 poth 258 *** empty log message *** 259 260 Revision 1.5 2006/03/30 21:20:26 poth 261 *** empty log message *** 262 263 Revision 1.4 2006/03/02 15:27:11 taddei 264 � 265 266 Revision 1.3 2006/02/21 12:59:34 taddei 267 added ensureSquare Env method, removed unused output methods 268 269 Revision 1.2 2006/02/21 09:28:10 taddei 270 include filter for making img transparent 271 272 Revision 1.1 2006/02/09 15:47:24 taddei 273 bug fixes, refactoring and javadoc 274 275 276 ********************************************************************** */