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