2016.02.22
画像の一部切り出し
はじめに
元の画像
切り出し画像
矩形範囲は、切り出す左上隅のピクセル座標・ピクセル幅・ピクセルの高さで指定します。ここで紹介する方法では、矩形の範囲が元の画像から外に出ないように指定し、外に出る場合は処理を実行しないようにしています。
Javaソースコード
Subimage.java
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039 040 041 042 043 044 045 046 047 048 049 050 051 052 053 054 055 056 057 058 059 060 061 062 063 064 065 066 067 068 069 070 071 072 073 074 075 076 077 078 079 080 081 082
import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; import java.io.IOException; import java.awt.image.RasterFormatException; public class Subimage { public static void main( String[] args ) { String inname, outname; // ファイル名 BufferedImage img = null; // 画像格納クラス // 入力した引数が6つ以上かを調べる if ( 6 > args.length ) { // 入力した引数が6つ未満の場合、使用方法を表示する System.out.println( "Subimage [入力JPEG名] [出力JPEG名] [X] [Y] [幅] [高さ]" ); return; } // 入力JPEG名をinnameに代入(拡張子".jpg"省略なし) inname = args[ 0 ]; // 出力JPEG名をoutnameに代入(拡張子".jpg"省略なし) outname = args[ 1 ]; // 変数の宣言 int x, y; // 切り出す左上のピクセル座標 int w, h; // 切り出す画像サイズ try { // 引数を変換し、縁の幅に代入 x = Integer.valueOf( args[ 2 ] ); y = Integer.valueOf( args[ 3 ] ); w = Integer.valueOf( args[ 4 ] ); h = Integer.valueOf( args[ 5 ] ); } catch( NumberFormatException ne ) { System.out.println( "引数が不正です" ); return; } if ( ( 1 > w ) || ( 1 > h ) ) { System.out.println( "画像サイズが不正です" ); return; } // JPEG画像の読み込み try { // inname(入力JPEG)を読み込んでimgにセット img = ImageIO.read( new File( inname ) ); } catch (Exception e) { // inname(入力JPEG)の読み込みに失敗したときの処理 e.printStackTrace(); return; } // 切り出し処理 BufferedImage subimg = null; // 切り出し画像格納クラス try { subimg = img.getSubimage( x, y, w, h ); } catch ( RasterFormatException re ) { System.out.println( "指定した範囲が画像の範囲外です" ); return; } // JPEG画像の保存 try { // subimgをoutname(出力JPEG)に保存 boolean result; result = ImageIO.write( subimg, "jpeg", new File( outname ) ); } catch ( Exception e ) { // outname(出力JPEG)の保存に失敗したときの処理 e.printStackTrace(); return; } // 正常に終了 System.out.println( "正常に終了しました" ); } }
コンパイル ソースコードが「ANSI」の場合
C:\talavax\javasample>javac -encoding sjis Subimage.java
コンパイル ソースコードが「UTF-8」の場合
C:\talavax\javasample>javac Subimage.java
実行
C:\talavax\javasample>java Subimage sampleimage001_400x320.jpg subimage.jpg 160 200 200 100
・元の画像(sampleimage001_400x320.jpg)
・切り出し後の画像(subimage.jpg)
Javaソースコードの解説
001 002 003 004 005
import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; import java.io.IOException; import java.awt.image.RasterFormatException;
Javaのクラスライブラリの中から「java.awt.image.BufferedImage」と「java.io.File」と「javax.imageio.ImageIO」と「java.io.IOException」と「java.awt.image.RasterFormatException」というパッケージにあるクラスを、このプログラム内で使うために記述します。 この記述により、ImageIOクラスとBufferedImageクラスとRasterFormatExceptionが利用できるようになります。
007
public class Subimage {
クラス名を、Subimageとしています。
008
public static void main( String[] args ) {
このmainメソッドからプログラムを実行します。
009 010
String inname, outname; // ファイル名 BufferedImage img = null; // 画像格納クラス
このプログラムで使う変数を宣言しています。
012 013 014 015 016 017 018
// 入力した引数が6つ以上かを調べる if ( 6 > args.length ) { // 入力した引数が6つ未満の場合、使用方法を表示する System.out.println( "Subimage [入力JPEG名] [出力JPEG名] [X] [Y] [幅] [高さ]" ); return; }
020 021 022 023
// 入力JPEG名をinnameに代入(拡張子".jpg"省略なし) inname = args[ 0 ]; // 出力JPEG名をoutnameに代入(拡張子".jpg"省略なし) outname = args[ 1 ];
025 026 027 028 029 030 031 032 033 034 035 036 037 038 039 040 041 042 043 044
// 変数の宣言 int x, y; // 切り出す左上のピクセル座標 int w, h; // 切り出す画像サイズ try { // 引数を変換し、縁の幅に代入 x = Integer.valueOf( args[ 2 ] ); y = Integer.valueOf( args[ 3 ] ); w = Integer.valueOf( args[ 4 ] ); h = Integer.valueOf( args[ 5 ] ); } catch( NumberFormatException ne ) { System.out.println( "引数が不正です" ); return; } if ( ( 1 > w ) || ( 1 > h ) ) { System.out.println( "画像サイズが不正です" ); return; }
047 048 049 050 051 052 053 054 055 056
// JPEG画像の読み込み try { // inname(入力JPEG)を読み込んでimgにセット img = ImageIO.read( new File( inname ) ); } catch (Exception e) { // inname(入力JPEG)の読み込みに失敗したときの処理 e.printStackTrace(); return; }
ImageIO.readメソッド
public static BufferedImage read( File input ) throws IOException
・Fileオブジェクトを復元した結果をBufferedImageに格納します。 パラメータ input : Fileオブジェクト 戻り値 inputを復元したBufferedImageaを返します。
try { ~ } catchは、失敗する可能性がある処理を波括弧で囲み、その処理に失敗したときにcatch { ~ }の波括弧で囲まれた処理を実行するということです。この場合は、JPEGファイル名が不正であったり、存在していなかったり、フォーマットが違っているなどが原因で処理が失敗する可能性があります。処理が失敗するとreturnによってmainメソッドを抜けるようにしています。
058 059 060 061 062 063 064 065 066
// 切り出し処理 BufferedImage subimg = null; // 切り出し画像格納クラス try { subimg = img.getSubimage( x, y, w, h ); } catch ( RasterFormatException re ) { System.out.println( "指定した範囲が画像の範囲外です" ); return; }
関連コンテンツ
一般に使われている画像フォーマットには、いろいろな種類があります。画像フォーマットBMP、JPEG、PNG、GIF、TIFFの特徴を知ってますか?
2015.11.29