ゆるゆるプログラミング

・画像の新規作成

ここでは、フルカラー(24bit)画像を新しく作成するソースコードを解説します。新しい画像は、グラフィックの描画や、画像処理の結果の保存や、画像処理の途中経過を保存する等に利用できます。

以下がそのソースコード例です。

CreateImage.java
001:    import java.awt.image.BufferedImage;
002:    import java.io.File;
003:    import javax.imageio.ImageIO;
004:    import java.io.IOException;
005:    
006:    public class CreateImage {
007:    	public static void main( String[] args ) {
008:    		// 結果格納フラグ
009:    		boolean result;
010:    		// 画像サイズ
011:    		int width, height;
012:    		// ファイル名
013:    		String outname;
014:    		// 画像格納クラス
015:    		BufferedImage img = null;
016:    
017:    		// 入力した引数が3つ以上かを調べる
018:    		if ( 3 > args.length ) {
019:    			// 入力した引数が3つ未満の場合、使用方法を表示する
020:    			System.out.println( "CreateImage [出力PNG名] [幅] [高さ]" );
021:    			return;
022:    		}
023:    
024:    		// 出力PNG名をoutnameに代入(拡張子".png"省略なし)
025:    		outname = args[ 0 ];
026:    
027:    		try {
028:    			// 幅ピクセルをwidthに代入
029:    			width  = Integer.parseInt( args[ 1 ] );
030:    			// 高さピクセルをheightに代入
031:    			height = Integer.parseInt( args[ 2 ] );
032:    		} catch ( NumberFormatException e ) {
033:    			// 引数をwidth、heightの変換に失敗したときの処理
034:    			e.printStackTrace();
035:    			return;
036:    		}
037:    
038:    		// 画像サイズの検査
039:    		if ( ( 1 > width ) || ( 1 > height ) ) {
040:    			// 画像のサイズに1より小さい値が指定されたとき処理
041:    			System.out.println( "画像サイズが範囲外です" );
042:    			return;
043:    		}
044:    
045:    		// 24ビットカラーの画像を作成
046:    		try {
047:    			img = new BufferedImage( width, height,
048:    						 BufferedImage.TYPE_INT_RGB );
049:    		} catch ( Exception e ) {
050:    			// 画像作成に失敗したときの処理
051:    			e.printStackTrace();
052:    			return;
053:    		}
054:     
055:    		// 24ビットカラーの画像を作成
056:    		try {
057:    			// imgをoutname(出力PNG)に保存
058:    			result = ImageIO.write( img, "png", new File( outname ) );
059:    		} catch ( Exception e ) {
060:    			// outname(出力PNG)の保存に失敗したときの処理
061:    			e.printStackTrace();
062:    			return;
063:    		}
064:    
065:    		// 正常に終了
066:    		System.out.println( "正常に終了しました" );
067:    	}
068:    }

CreateImageを実行

C:\talavax\javasample>java CreateImage createimage.png 256 128

1つ目の引数で渡したPNGファイルを新しく作成します。その画像のサイズは、2つ目の引数で指定した幅ピクセル、3つ目の引数で指定した高さピクセルで作成されます。

実行結果

・作成した画像(createimage.png)

新規画像

新しく、黒色のPNG画像が作成されました。

ここからは、このソースコードを上から順番に解説していきます。

001:    import java.awt.image.BufferedImage;
002:    import java.io.File;
003:    import javax.imageio.ImageIO;
004:    import java.io.IOException;

Javaのクラスライブラリの中から「java.awt.image.BufferedImage」と「java.io.File」と「javax.imageio.ImageIO」と「java.io.IOException」というパッケージにあるクラスを、このプログラム内で使うために記述します。 この記述により、ImageIOクラスBufferedImageクラスが利用できるようになります。

006:    public class CreateImage {

クラス名を、CreateImageとしています。

007:    	public static void main( String[] args ) {

このmainメソッドからプログラムを実行します。

008:    		// 結果格納フラグ
009:    		boolean result;
010:    		// 画像サイズ
011:    		int width, height;
012:    		// ファイル名
013:    		String outname;
014:    		// 画像格納クラス
015:    		BufferedImage img = null;

このプログラムで使う変数を宣言しています。どのように使われているかは、後ろのソースコードで。

017:    		// 入力した引数が3つ以上かを調べる
018:    		if ( 3 > args.length ) {
019:    			// 入力した引数が3つ未満の場合、使用方法を表示する
020:    			System.out.println( "CreateImage [出力PNG名] [幅] [高さ]" );
021:    			return;
022:    		}

1つ以上の引数が与えられたかをチェックし、1つ未満の場合に、使い方のメッセージを表示し、returnによってmainメソッドを抜けています。

024:    		// 出力PNG名をoutnameに代入(拡張子".png"省略なし)
025:    		outname = args[ 0 ];

与えられた1つ目の引数を、出力PNG名の変数(outname)代入しています。

027:    		try {
028:    			// 幅ピクセルをwidthに代入
029:    			width  = Integer.parseInt( args[ 1 ] );
030:    			// 高さピクセルをheightに代入
031:    			height = Integer.parseInt( args[ 2 ] );
032:    		} catch ( NumberFormatException e ) {
033:    			// 引数をwidth、heightの変換に失敗したときの処理
034:    			e.printStackTrace();
035:    			return;
036:    		}

与えられた2つ目と3つ目の引数を、それぞれ、幅ピクセルwidth、高さピクセルheightに代入しています。

038:    		// 画像サイズの検査
039:    		if ( ( 1 > width ) || ( 1 > height ) ) {
040:    			// 画像のサイズに1より小さい値が指定されたとき処理
041:    			System.out.println( "画像サイズが範囲外です" );
042:    			return;
043:    		}

ピクセルwidth、高さピクセルheightが1以上はどうかをチェックして、1未満であればエラーを表示して終了しています。

045:    		// 24ビットカラーの画像を作成
046:    		try {
047:    			img = new BufferedImage( width, height,
048:    						 BufferedImage.TYPE_INT_RGB );
049:    		} catch ( Exception e ) {
050:    			// 画像作成に失敗したときの処理
051:    			e.printStackTrace();
052:    			return;
053:    		}

BufferedImageクラスコンストラクタで、新しいBufferedImageを構築しています。

BufferedImageコンストラクタ

BufferedImage( int width, int height, int imageType )
■新しい BufferedImage を構築します。
  パラメータ width     : 構築する画像の横ピクセル
        height    : 構築する画像の縦ピクセル
        imageType : 構築する画像のイメージ形式

imgTypeで指定しているTYPE_INT_RGBは、整数ピクセルにパックされた 8 ビット RGB 色成分によるイメージを表します。これを指定することで24ビットの画像を作成できます。

try { ~ } catchは、失敗する可能性がある処理を波括弧で囲み、その処理に失敗したときにcatch { ~ }の波括弧で囲まれた処理を実行するということです。この場合は、PNGファイル名が不正であったり、存在していなかったり、フォーマットが違っているなどが原因で処理が失敗する可能性があります。処理が失敗するとreturnによってmainメソッドを抜けるようにしています。

055:    		// 24ビットカラーの画像を作成
056:    		try {
057:    			// imgをoutname(出力PNG)に保存
058:    			result = ImageIO.write( img, "png", new File( outname ) );
059:    		} catch ( Exception e ) {
060:    			// outname(出力PNG)の保存に失敗したときの処理
061:    			e.printStackTrace();
062:    			return;
063:    		}

BufferedImageクラスのimgのメモリ内のデータを、出力PNG名の変数(outname)に格納されているファイル名で保存します。この場合は、PNGファイル名が不正であったり、保存先のHDDなどが存在していなかったり、空き容量が少ないなどが原因で処理が失敗する可能性があります。

ImageIO.wrireメソッド

public static boolean write( RenderedImage im, String formatName, File output ) throws IOException
■BufferedImageを画像ファイルに保存します。

  パラメータ RenderedImage : 保存するRenderedImage
                  formatName     : 画像ファイルのフォーマット(png/jpeg/bmp/gifなど)
                  output             : Fileオブジェクト

  戻り値     保存に成功するとtrue、失敗するとfalseを返します。

065:    		// 正常に終了
066:    		System.out.println( "正常に終了しました" );

全ての処理が正常終了すると、ここまで処理が実行されます。

■関連コンテンツ

画像の色 画像の色について解説
画像ファイル形式 画像ファイル形式について解説

■新着情報

2017.11.17 N値化 カラー画像をN値化する方法について解説
2017.11.16 最も近い値の取得 指定値に最も近い配列の値を取得する方法を解説
2017.10.02 アルファ値(透過) アルファ値(透過)について

■広告

法人向けのETC専用カード

~約8,000名の受講生と80社以上の導入実績~ 企業向けプログラミング研修ならCodeCamp

日本最大級ショッピングサイト!お買い物なら楽天市場

Topへ