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.fukurou.util; 017 018import java.awt.geom.AffineTransform; 019import java.awt.image.AffineTransformOp; 020import java.awt.image.BufferedImage; 021 022import org.opengion.fukurou.system.OgRuntimeException ; // 6.4.2.0 (2016/01/29) 023import org.opengion.fukurou.system.LogWriter; // 6.4.2.0 (2016/01/29) package変更 fukurou.util → fukurou.system 024 025/** 026 * ImageResizer ã¯ã€ç”»åƒãƒ•ã‚¡ã‚¤ãƒ«ã®ãƒªã‚µã‚¤ã‚ºã‚’è¡Œã†ãŸã‚ã®ã‚¯ãƒ©ã‚¹ã§ã™ã€‚ 027 * ã“ã“ã§ã®ä½¿ã„æ–¹ã¯ã€åˆæœŸåŒ–時ã«ã€ã‚ªãƒªã‚¸ãƒŠãƒ«ã®ç”»åƒãƒ•ã‚¡ã‚¤ãƒ«ã‚’指定ã—〠028 * 変æ›æ™‚ã«å„縮å°æ–¹æ³•ã«å¯¾å¿œã—ãŸãƒ¡ã‚½ãƒƒãƒ‰ã‚’呼ã³å‡ºã—ã€ç”»åƒã‚’変æ›ã—ã¾ã™ã€‚ 029 * 変æ›æ–¹æ³•ã¨ã—ã¦ã¯ã€ä»¥ä¸‹ã®3ã¤ãŒã‚ã‚Šã¾ã™ã€‚ 030 * ①最大サイズ(px)指定ã«ã‚ˆã‚‹å¤‰æ› 031 * 縦横ã®æœ€å¤§ã‚µã‚¤ã‚º(px)を指定ã—ã€å¤‰æ›ã‚’è¡Œã„ã¾ã™ã€‚ 032 * 横長ã®ç”»åƒã«ã¤ã„ã¦ã¯ã€å¤‰æ›å¾Œã®æ¨ªå¹…=最大サイズã¨ãªã‚Šã€ç¸¦å¹…ã«ã¤ã„ã¦ã¯ã€æ¨ªå¹…ã® 033 * 縮å°çŽ‡ã«å¾“ã£ã¦æ±ºå®šã•ã‚Œã¾ã™ã€‚ 034 * 逆ã«ç¸¦é•·ã®ç”»åƒã«ã¤ã„ã¦ã¯ã€å¤‰æ›å¾Œã®ç¸¦å¹…=最大サイズã¨ãªã‚Šã€æ¨ªå¹…ã«ã¤ã„ã¦ã¯ã€ç¸¦å¹…ã® 035 * 縮å°çŽ‡ã«å¾“ã£ã¦æ±ºå®šã•ã‚Œã¾ã™ã€‚ 036 * ②縦横サイズ(px)指定ã«ã‚ˆã‚‹å¤‰æ› 037 * 縦横ã®å¤‰æ›å¾Œã®ã‚µã‚¤ã‚º(px)を個別ã«æŒ‡å®šã—ã€å¤‰æ›ã‚’è¡Œã„ã¾ã™ã€‚ 038 * ③縮å°çŽ‡æŒ‡å®šã«ã‚ˆã‚‹å¤‰æ› 039 * "1"を元サイズã¨ã™ã‚‹ç¸®å°çŽ‡ã‚’指定ã—ã€å¤‰æ›ã‚’è¡Œã„ã¾ã™ã€‚ 040 * 縮å°çŽ‡ã¯ã€ç¸¦æ¨ªã§åŒã˜ç¸®å°çŽ‡ãŒé©ç”¨ã•ã‚Œã¾ã™ã€‚ 041 * 入力フォーマットã¨ã—ã¦ã¯JPEG/PNG/GIFã«ã€å‡ºåŠ›ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã¨ã—ã¦ã¯JPEG/PNGã«å¯¾å¿œã—ã¦ã„ã¾ã™ã€‚ 042 * 出力フォーマットã«ã¤ã„ã¦ã¯ã€å‡ºåŠ›ãƒ•ã‚¡ã‚¤ãƒ«åã®æ‹¡å¼µåより自動的ã«æ±ºå®šã•ã‚Œã¾ã™ãŒã€ä¸€èˆ¬çš„ã«ã¯ 043 * サイズãŒå°ã•ããªã‚‹jpegファイルを推奨ã—ã¾ã™ã€‚ 044 * 入出力フォーマットã«ã¤ã„ã¦ã€å¯¾å¿œã—ã¦ã„ãªã„フォーマットãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã¯ä¾‹å¤–ãŒç™ºç”Ÿã—ã¾ã™ã€‚ 045 * ã¾ãŸã€ç¸¦æ¨ªã®å‡ºåŠ›ã‚µã‚¤ã‚ºãŒå…¥åŠ›ã‚µã‚¤ã‚ºã®ç¸¦æ¨ªã‚ˆã‚Šã‚‚両方大ãã„å ´åˆã€å¤‰æ›ã¯è¡Œã‚ã‚Œãšã€å…¥åŠ›ãƒ•ã‚¡ã‚¤ãƒ«ãŒ 046 * ãã®ã¾ã¾ã‚³ãƒ”ーã•ã‚Œã¦å‡ºåŠ›ã•ã‚Œã¾ã™ã€‚(拡大変æ›ã¯è¡Œã‚ã‚Œã¾ã›ã‚“) 047 * 048 * @og.rev 6.0.2.3 (2014/10/10) static ç³»ã®ãƒ¡ã‚½ãƒƒãƒ‰ã¯ã€ImageUtil ã«ç§»å‹• 049 * 050 * @version 4.0 051 * @author Hiroki Nakamura 052 * @since JDK5.0, 053 */ 054public class ImageResizer { 055 056 private final BufferedImage inputImage; // 入力画åƒã‚ªãƒ–ジェクト 057 058 private final int inSizeX; // 入力画åƒã®æ¨ªã‚µã‚¤ã‚º 059 private final int inSizeY; // 入力画åƒã®ç¸¦ã‚µã‚¤ã‚º 060 061 /** 062 * 入力ファイルåを指定ã—ã€ç”»åƒç¸®å°ã‚ªãƒ–ジェクトをåˆæœŸåŒ–ã—ã¾ã™ã€‚ 063 * 064 * @og.rev 5.4.3.5 (2012/01/17) CMYK対応 065 * @og.rev 5.4.3.7 (2012/01/20) FAIã§ã®ãƒ•ã‚¡ã‚¤ãƒ«å–得方法変更 066 * @og.rev 5.4.3.8 (2012/01/24) ã‚¨ãƒ©ãƒ¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸è¿½åŠ 067 * @og.rev 5.6.5.3 (2013/06/28) 入力画åƒã®å½¢å¼ ã‚’ ImageIO ã‹ã‚‰å–り出ã—ã¾ã™ã€‚ 068 * @og.rev 5.6.5.3 (2013/06/28) 入力画åƒã®å½¢å¼ ã‚’ ImageIO ã‹ã‚‰å–り出ã—ã¾ã™ã€‚ 069 * @og.rev 6.0.2.3 (2014/10/10) ImageUtil ã‹ã‚‰å–り出ã—ã¾ã™ã€‚ 070 * 071 * @param fin 入力ファイルå 072 */ 073 public ImageResizer( final String fin ) { 074 inputImage = ImageUtil.readFile( fin ); 075 076 inSizeX = inputImage.getWidth(); 077 inSizeY = inputImage.getHeight(); 078 } 079 080 /** 081 * 縦横ã®æœ€å¤§ã‚µã‚¤ã‚º(px)を指定ã—ã€å¤‰æ›ã‚’è¡Œã„ã¾ã™ã€‚ 082 * 横長ã®ç”»åƒã«ã¤ã„ã¦ã¯ã€å¤‰æ›å¾Œã®æ¨ªå¹…=最大サイズã¨ãªã‚Šã€ç¸¦å¹…ã«ã¤ã„ã¦ã¯ã€æ¨ªå¹…ã® 083 * 縮å°çŽ‡ã«å¾“ã£ã¦æ±ºå®šã•ã‚Œã¾ã™ã€‚ 084 * 逆ã«ç¸¦é•·ã®ç”»åƒã«ã¤ã„ã¦ã¯ã€å¤‰æ›å¾Œã®ç¸¦å¹…=最大サイズã¨ãªã‚Šã€æ¨ªå¹…ã«ã¤ã„ã¦ã¯ã€ç¸¦å¹…ã® 085 * 縮å°çŽ‡ã«å¾“ã£ã¦æ±ºå®šã•ã‚Œã¾ã™ã€‚ 086 * 087 * @param fname 出力ファイルå 088 * @param maxSize 変æ›å¾Œã®ç¸¦æ¨ªã®æœ€å¤§ã‚µã‚¤ã‚º 089 */ 090 public void resizeByPixel( final String fname, final int maxSize ) { 091 int sizeX = 0; 092 int sizeY = 0; 093 if( inSizeX > inSizeY ) { 094 sizeX = maxSize; 095 sizeY = inSizeY * maxSize / inSizeX; 096 } 097 else { 098 sizeX = inSizeX * maxSize / inSizeY; 099 sizeY = maxSize; 100 } 101 convert( inputImage, fname, sizeX, sizeY ); 102 } 103 104 /** 105 * 縦横ã®å¤‰æ›å¾Œã®ã‚µã‚¤ã‚º(px)を個別ã«æŒ‡å®šã—ã€å¤‰æ›ã‚’è¡Œã„ã¾ã™ã€‚ 106 * 107 * @param fname 出力ファイルå 108 * @param sizeX 変æ›å¾Œã®æ¨ªã‚µã‚¤ã‚º(px) 109 * @param sizeY 変æ›å¾Œã®ç¸¦ã‚µã‚¤ã‚º(px) 110 */ 111 public void resizeByPixel( final String fname, final int sizeX, final int sizeY ) { 112 convert( inputImage, fname, sizeX, sizeY ); 113 } 114 115 /** 116 * "1"を元サイズã¨ã™ã‚‹ç¸®å°çŽ‡ã‚’指定ã—ã€å¤‰æ›ã‚’è¡Œã„ã¾ã™ã€‚ 117 * 縮å°çŽ‡ã¯ã€ç¸¦æ¨ªã§åŒã˜ç¸®å°çŽ‡ãŒé©ç”¨ã•ã‚Œã¾ã™ã€‚ 118 * 119 * @param fname 出力ファイルå 120 * @param ratio 縮å°çŽ‡ 121 */ 122 public void resizeByRatio( final String fname, final double ratio ) { 123 final int sizeX = (int)( inSizeX * ratio ); 124 final int sizeY = (int)( inSizeY * ratio ); 125 convert( inputImage, fname, sizeX, sizeY ); 126 } 127 128 /** 129 * ç”»åƒã®å¤‰æ›ã‚’è¡Œã†ãŸã‚ã®å†…部共通メソッドã§ã™ã€‚ 130 * 131 * @og.rev 5.4.1.0 (2011/11/01) ç”»åƒã«ã‚ˆã£ã¦getTypeãŒ0ã‚’è¿”ã—ã€ã‚¨ãƒ©ãƒ¼ã«ãªã‚‹ä¸å…·åˆã‚’ä¿®æ£ 132 * @og.rev 5.6.5.3 (2013/06/28) 出力画åƒã®å½¢å¼ ã‚’ ImageIO ã‹ã‚‰å–り出ã—ã¾ã™ã€‚ 133 * @og.rev 5.6.5.3 (2013/06/28) 5.6.6.1 (2013/07/12) getSuffix ã™ã‚‹ã‚¿ã‚¤ãƒŸãƒ³ã‚°ã‚’後ã‚ã«ã™ã‚‹ã€‚ 134 * @og.rev 5.6.6.1 (2013/07/12) æ‹¡å¼µåã®å¤‰æ›´ãŒã‚ã‚‹ã®ã§ã€å¤‰æ›ã—ãªã„処ç†ã¯ã€ãªã„。 135 * @og.rev 6.0.2.3 (2014/10/10) ImageUtil ã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’一部使用ã™ã‚‹ã‚ˆã†ã«å¤‰æ›´ã—ã¾ã™ã€‚ 136 * 137 * @param inputImage 入力画åƒã‚ªãƒ–ジェクト 138 * @param fname 出力ファイルå 139 * @param sizeX 横サイズ(px) 140 * @param sizeY 縦サイズ(px) 141 */ 142 private void convert( final BufferedImage inputImage, final String fname, final int sizeX, final int sizeY ) { 143 // 5.6.6.1 (2013/07/12) getSuffix ã™ã‚‹ã‚¿ã‚¤ãƒŸãƒ³ã‚°ã‚’後ã‚ã«ã™ã‚‹ã€‚ 144 // 5.6.5.3 (2013/06/28) 出力画åƒã®å½¢å¼ ã‚’ ImageIO ã‹ã‚‰å–り出ã—ã¾ã™ã€‚ 145 // 6.0.2.3 (2014/10/10) ImageUtil ã®ãƒ¡ã‚½ãƒƒãƒ‰ 146 if( !ImageUtil.isWriterSuffix( fname ) ) { 147 final String errMsg = "出力ファイルã¯" + ImageUtil.WRITER_SUFFIXES + "ã®ã„ãšã‚Œã‹ã®å½¢å¼ã®ã¿æŒ‡å®šå¯èƒ½ã§ã™ã€‚" + "File=[" + fname + "]"; 148 throw new OgRuntimeException( errMsg ); 149 } 150 151 // 5.4.1.0 (2011/11/01) ç”»åƒã«ã‚ˆã£ã¦getTypeãŒ0ã‚’è¿”ã—ã€ã‚¨ãƒ©ãƒ¼ã«ãªã‚‹ä¸å…·åˆã‚’ä¿®æ£ 152 final int type = inputImage.getType(); 153 BufferedImage resizeImage = null; 154 if( type == 0 ) { 155 resizeImage = new BufferedImage( sizeX, sizeY, BufferedImage.TYPE_4BYTE_ABGR_PRE ); 156 } 157 else { 158 resizeImage = new BufferedImage( sizeX, sizeY, inputImage.getType() ); 159 } 160 AffineTransformOp ato = null; 161 ato = new AffineTransformOp( 162 AffineTransform.getScaleInstance( 163 (double)sizeX/inSizeX, (double)sizeY/inSizeY ), null ); 164 ato.filter( inputImage, resizeImage ); 165 166 ImageUtil.saveFile( resizeImage,fname ); // 6.0.2.3 (2014/10/10) ImageUtil ã®ãƒ¡ã‚½ãƒƒãƒ‰ 167 } 168 169 /** 170 * メイン処ç†ã§ã™ã€‚ 171 * Usage: java org.opengion.fukurou.util.ImageResizer [Input Filename] [OutputFilename] [-max=maxResize] [-ratio=ratio] [-x=sizeX] [-y=sizeY] 172 * 173 * @og.rev 6.4.5.1 (2016/04/28) mainメソッドã®èµ·å‹•æ–¹æ³•ã‚’変更ã—ã¾ã™ã€‚ 174 * 175 * [-max=MaxResize] :最大サイズを指定ã—ã¦ã€ãƒªã‚µã‚¤ã‚ºã—ã¾ã™ã€‚ 176 * [-ratio=ratio] :縮å°çŽ‡ã‚’指定ã—ã¦ã€ãƒªã‚µã‚¤ã‚ºã—ã¾ã™ã€‚ 177 * [-x=sizeX] [-y=sizeY] : X,Y サイズを指定ã—ã¦ã€ãƒªã‚µã‚¤ã‚ºã—ã¾ã™ã€‚ 178 * 179 * @param args 引数文å—列é…列 入力ファイルã€å‡ºåŠ›ãƒ•ã‚¡ã‚¤ãƒ«ã€ç¸¦æ¨ªæœ€å¤§ã‚µã‚¤ã‚º 180 */ 181 public static void main( final String[] args ) { 182 if( args.length < 3 ) { 183 LogWriter.log( "Usage: java org.opengion.fukurou.util.ImageResizer [Input Filename] [OutputFilename] [-max=maxResize] [-ratio=ratio] [-x=sizeX] [-y=sizeY]" ); 184 return ; 185 } 186 187 final String inFile = args[0]; 188 final String outFile = args[1]; 189 190 int maxResize = -1; 191 double ratio = -1d; 192 int sizeX = -1; 193 int sizeY = -1; 194 195 for( int i=2; i<args.length; i++ ) { 196 if( args[i].startsWith( "-max=" ) ) { maxResize = Integer.parseInt( args[i].substring( 5 ) ); } // 5 = "-max=".length() 197 if( args[i].startsWith( "-ratio=" ) ) { ratio = Double.parseDouble( args[i].substring( 7 ) ); } // 7 = "-ratio=".length() 198 if( args[i].startsWith( "-x=" ) ) { sizeX = Integer.parseInt( args[i].substring( 3 ) ); } // 3 = "-x=".length() 199 if( args[i].startsWith( "-y=" ) ) { sizeY = Integer.parseInt( args[i].substring( 3 ) ); } // 3 = "-y=".length() 200 } 201 202 final ImageResizer ir = new ImageResizer( inFile ); 203 204 if( maxResize > 0 ) { 205 ir.resizeByPixel( outFile, maxResize ); 206 } 207 if( ratio > 0d ) { 208 ir.resizeByRatio( outFile, ratio ); 209 } 210 if( sizeX > 0 && sizeY > 0 ) { 211 ir.resizeByPixel( outFile, sizeX , sizeY ); 212 } 213 } 214}