001/* 002 * Copyright (c) 2009 The openGion Project. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 013 * either express or implied. See the License for the specific language 014 * governing permissions and limitations under the License. 015 */ 016package org.opengion.hayabusa.servlet; 017 018import org.opengion.fukurou.system.Closer ; 019 020import java.awt.Color; 021import java.awt.Font; 022import java.awt.Graphics2D; 023import java.awt.image.BufferedImage; 024import java.util.Iterator; 025import javax.imageio.ImageIO; 026import javax.imageio.ImageWriter; 027import javax.imageio.stream.ImageOutputStream; 028 029import java.io.File; 030import java.io.IOException; 031import javax.servlet.ServletException; 032import javax.servlet.ServletConfig; 033import javax.servlet.http.HttpServlet; 034import javax.servlet.http.HttpServletRequest; 035import javax.servlet.http.HttpServletResponse; 036import javax.servlet.ServletOutputStream; 037 038/** 039 * 画像イメージに、文字列を動的に合成作成する、サーブレットです。 040 * 041 * 画像イメージを読取り、そこに、引数のテキスト文字列を合成します。 042 * 元は、googleMap のマーカーに、マーカー番号を合成する為に作られました。 043 * 044 * 一般的なサーブレットと同様に、デプロイメント・ディスクリプタ WEB-INF/web.xml に、 045 * servlet 要素と そのマッピング(servlet-mapping)を定義する必要があります。 046 * 047 * <servlet> 048 * <servlet-name>makeImage</servlet-name> 049 * <servlet-class>org.opengion.hayabusa.servlet.MakeImage</servlet-class> 050 * </servlet> 051 * 052 * <servlet-mapping> 053 * <servlet-name>makeImage</servlet-name> 054 * <url-pattern>/jsp/makeImage</url-pattern> 055 * </servlet-mapping> 056 * 057 * 一般には、http://サーバー:ポート/システムID/jsp/makeImage?text=番号 058 * 形式のURL でアクセスします。 059 * 060 * @og.rev 3.8.1.1 (2005/11/21) 新規追加 061 * @og.group その他機能 062 * 063 * @version 0.9.0 2000/10/17 064 * @author Kazuhiko Hasegawa 065 * @since JDK1.1, 066 */ 067public class MakeImage extends HttpServlet { 068 private static final long serialVersionUID = 400020050131L ; 069 070 private static final String FORM_NAME = "png" ; // jpg,BMP,bmp,JPG,wbmp,jpeg,png,PNG,JPEG,WBMP,GIF,gif 071 private String imageFile ; 072 073 /** 074 * GET メソッドが呼ばれたときに実行します。 075 * 076 * 処理は、doPost へ振りなおしています。 077 * 078 * @param request HttpServletRequestオブジェクト 079 * @param response HttpServletResponseオブジェクト 080 * 081 * @og.rev 3.8.1.2 (2005/12/19) 半角カナ-全角カナ変換機能の追加 082 * 083 * @throws ServletException サーブレット関係のエラーが発生した場合、throw されます。 084 * @throws IOException 入出力エラーが発生したとき 085 */ 086 @Override 087 public void doGet( final HttpServletRequest request, final HttpServletResponse response ) 088 throws ServletException, IOException { 089 doPost( request,response ); 090 } 091 092 /** 093 * POST メソッドが呼ばれたときに実行します。 094 * 095 * @param request HttpServletRequestオブジェクト 096 * @param response HttpServletResponseオブジェクト 097 * 098 * @throws ServletException サーブレット関係のエラーが発生した場合、throw されます。 099 * @throws IOException 入出力エラーが発生したとき 100 */ 101 @Override 102 public void doPost( final HttpServletRequest request, final HttpServletResponse response ) 103 throws ServletException, IOException { 104 105 final String text = request.getParameter( "text" ); 106 107 // contentTypeを出力 108 response.setContentType( "image/" + FORM_NAME ); 109 110 ServletOutputStream out = null; 111 try { 112 out = response.getOutputStream(); 113 final BufferedImage img = createImage( text ); 114 // JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); 115 // encoder.encode( img ); 116 // out.flush(); 117 118 final Iterator<ImageWriter> ite = ImageIO.getImageWritersByFormatName( FORM_NAME ); // 4.3.3.6 (2008/11/15) Generics警告対応 119 final ImageWriter writer = ite.next(); // 4.3.3.6 (2008/11/15) Generics警告対応 120 final ImageOutputStream ios = ImageIO.createImageOutputStream( out ); 121 writer.setOutput( ios ); 122 writer.write( img ); 123 out.flush(); 124 ios.close(); 125 126 // ImageIO.write( img,FORM_NAME,new File( "G:/webapps/gf/jsp/GF7010/test" + FORM_NAME ) ); 127 } 128 finally { 129 Closer.ioClose( out ); // 4.0.0 (2006/01/31) close 処理時の IOException を無視 130 } 131 } 132 133 /** 134 * イメージの合成処理を行います。 135 * 136 * @param text 合成するテキスト 137 * 138 * @return イメージの合成されたBufferedImageオブジェクト 139 * @throws IOException 入出力エラーが発生したとき 140 */ 141 private BufferedImage createImage( final String text ) throws IOException { 142 // イメージの作成 143 // BufferedImage image = new BufferedImage(25, 25, BufferedImage.TYPE_INT_ARGB); 144 145 final BufferedImage image = ImageIO.read( new File( imageFile ) ); 146 final Graphics2D gph = (Graphics2D)image.getGraphics(); 147 148 final int xsp = (text.length() == 1) ? 8 : 2 ; 149 150 // gph.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, 151 // RenderingHints.VALUE_TEXT_ANTIALIAS_ON); 152 // gph.setColor(new Color(255,255,255)); 153 // gph.fillRect(0,0,25,25); 154 gph.setFont(new Font("Serif", Font.BOLD, 14)); 155 gph.setColor(new Color(0,0,255)); 156 gph.drawString(text, xsp, 15); 157 // gph.setColor(new Color(0,255,0)); 158 // gph.drawOval(2,2,22,22); 159 160 gph.dispose(); 161 162 return image; 163 } 164 165 /** 166 * Servlet の 初期値設定を行います。 167 * 168 * WEB-INF/web.xml ファイルで、<servlet> タグ内で初期値設定を行います。 169 * <init-param> 170 * <param-name>imageFile</param-name> 171 * <param-value>G:/webapps/gf/jsp/GF7010/mark.png</param-value> 172 * </init-param> 173 * 174 * @param config ServletConfigオブジェクト 175 */ 176 @Override 177 public void init( final ServletConfig config ) throws ServletException { 178 super.init( config ); 179 180 imageFile = config.getInitParameter("imageFile"); 181 } 182 183 /** 184 * PNGイメージの透過色指定を行います。 185 * 186 * 引数のファイル(PNG)を読取り、白色を透過色に変換後、セーブします。 187 * ただし、PNG形式で透過をサポートしているのは、IE7,Firefox,opera 等で、 188 * IE6 は未サポート(グレーになる)です。 189 * 190 * Usage: java org.opengion.hayabusa.servlet.MakeImage IN_FILE OUT_FILE 191 * 192 * @param args コマンド引数配列 193 * @throws IOException 入出力エラーが発生したとき 194 */ 195 public static void main( final String[] args ) throws IOException { 196 197 final BufferedImage org = ImageIO.read( new File( args[0] ) ); 198 199 final int wd = org.getWidth(); 200 final int ht = org.getHeight(); 201 final BufferedImage dst = new BufferedImage(wd, ht, BufferedImage.TYPE_INT_ARGB); 202 for( int y=0; y<ht; y++ ) { 203 for( int x=0; x<wd; x++ ) { 204 if( org.getRGB(x, y) == 0xFFFFFFFF ) { //白 205 dst.setRGB(x, y, 0); //透明 206 } 207 else { 208 dst.setRGB(x, y, org.getRGB(x, y)); 209 } 210 } 211 } 212 ImageIO.write( dst,"png",new File( args[1] ) ); 213 } 214}