Javaプログラミング学習サイト ゆるゆるプログラミング

2020/03/23 公開

・画像の新規作成 その2

フルカラー(24bit)の画像を新しく作成する方法を解説します。

ここで解説するのは、横方向と縦方向のピクセル数と背景色(RGB)を指定してPNG形式画像ファイルを作成するものです。

新しく作成した画像は、グラフィックの描画や、画像処理の結果の保存や、画像処理の途中経過を保存する等に利用できます。

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

CreateImage2.java ← クリックしてダウンロードページに移動
001:    import java.awt.image.BufferedImage;
002:    import java.awt.Graphics2D;
003:    import java.awt.Color;
004:    import java.io.File;
005:    import javax.imageio.ImageIO;
006:    import java.io.IOException;
007:    
008:    public class CreateImage2 {
009:    	public static void main( String[] args ) {
010:    		// 結果格納フラグ
011:    		boolean result;
012:    		// 画像サイズ
013:    		int width, height;
014:    		// 背景色
015:    		int back_r, back_g, back_b;
016:    		// ファイル名
017:    		String outname;
018:    		// 画像格納クラス
019:    		BufferedImage img = null;
020:    
021:    		// 入力した引数が6つ以上かを調べる
022:    		if ( 6 > args.length ) {
023:    			// 入力した引数が6つ未満の場合、使用方法を表示する
024:    			System.out.println( "CreateImage2 [PNG名][幅][高さ][R][G][B]" );
025:    			return;
026:    		}
027:    
028:    		// 出力PNG名をoutnameに代入(拡張子".png"省略なし)
029:    		outname = args[ 0 ];
030:    
031:    		try {
032:    			// 幅ピクセルをwidthに代入
033:    			width  = Integer.parseInt( args[ 1 ] );
034:    			// 高さピクセルをheightに代入
035:    			height = Integer.parseInt( args[ 2 ] );
036:    			// 赤の輝度(R)をback_rに代入
037:    			back_r = Integer.parseInt( args[ 3 ] );
038:    			// 緑の輝度(G)をback_gに代入
039:    			back_g = Integer.parseInt( args[ 4 ] );
040:    			// 青の輝度(B)をback_bに代入
041:    			back_b = Integer.parseInt( args[ 5 ] );
042:    		} catch ( NumberFormatException e ) {
043:    			// 引数をwidth、heightの変換に失敗したときの処理
044:    			e.printStackTrace();
045:    			return;
046:    		}
047:    
048:    		// 画像サイズの検査
049:    		if ( ( 1 > width ) || ( 1 > height ) ) {
050:    			// 画像のサイズに1より小さい値が指定されたとき処理
051:    			System.out.println( "画像サイズが範囲外です" );
052:    			return;
053:    		}
054:    
055:    		// RGBの検査(0~255の範囲内か)
056:    		if ( ( 0 > back_r ) || ( 255 < back_r ) ) {
057:    			System.out.println( "背景色Rの値が範囲外です" );
058:    			return;
059:    		}
060:    		if ( ( 0 > back_g ) || ( 255 < back_g ) ) {
061:    			System.out.println( "背景色Gの値が範囲外です" );
062:    			return;
063:    		}
064:    		if ( ( 0 > back_b ) || ( 255 < back_b ) ) {
065:    			System.out.println( "背景色Bの値が範囲外です" );
066:    			return;
067:    		}
068:    
069:    		// 24ビットカラーの画像を作成
070:    		try {
071:    			img = new BufferedImage( width, height,
072:    						 BufferedImage.TYPE_INT_RGB );
073:    		} catch ( Exception e ) {
074:    			// 画像作成に失敗したときの処理
075:    			e.printStackTrace();
076:    			return;
077:    		}
078:    
079:    		// 背景色で画像全体を塗り潰し
080:    		Graphics2D g = (Graphics2D)img.getGraphics();
081:    		g.setColor( new Color( back_r, back_g, back_b ) );
082:    		g.fillRect( 0, 0, width, height );
083:    
084:    		// 24ビットカラーの画像を作成
085:    		try {
086:    			// imgをoutname(出力PNG)に保存
087:    			result = ImageIO.write( img, "png", new File( outname ) );
088:    		} catch ( Exception e ) {
089:    			// outname(出力PNG)の保存に失敗したときの処理
090:    			e.printStackTrace();
091:    			return;
092:    		}
093:    
094:    		// 正常に終了
095:    		System.out.println( "正常に終了しました" );
096:    	}
097:    }

CreateImage2を実行

C:\talavax\javasample>java CreateImage2 createimage2.png 256 128 255 0 0

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

実行結果

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

新規画像(背景色指定)

新しく、赤色(R=255,G=0,B=0)のPNG画像が作成されました。

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

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

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

008:    public class CreateImage2 {

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

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

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

010:    		// 結果格納フラグ
011:    		boolean result;
012:    		// 画像サイズ
013:    		int width, height;
014:    		// 背景色
015:    		int back_r, back_g, back_b;
016:    		// ファイル名
017:    		String outname;
018:    		// 画像格納クラス
019:    		BufferedImage img = null;

このプログラムで使う変数を宣言しています。

021:    		// 入力した引数が6つ以上かを調べる
022:    		if ( 6 > args.length ) {
023:    			// 入力した引数が6つ未満の場合、使用方法を表示する
024:    			System.out.println( "CreateImage2 [PNG名][幅][高さ][R][G][B]" );
025:    			return;
026:    		}

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

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

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

032:    			// 幅ピクセルをwidthに代入
033:    			width  = Integer.parseInt( args[ 1 ] );
034:    			// 高さピクセルをheightに代入
035:    			height = Integer.parseInt( args[ 2 ] );

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

036:    			// 赤の輝度(R)をback_rに代入
037:    			back_r = Integer.parseInt( args[ 3 ] );
038:    			// 緑の輝度(G)をback_gに代入
039:    			back_g = Integer.parseInt( args[ 4 ] );
040:    			// 青の輝度(B)をback_bに代入
041:    			back_b = Integer.parseInt( args[ 5 ] );

与えられた4つ目~6つ目の値をそれぞれ、背景色を格納する変数back_r/back_g/back_bに代入しています。

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

画像サイズwidth、heightのいずれかが1未満の場合には、エラーメッセージを出力し、return文mainメソッドを抜けています。

055:    		// RGBの検査(0~255の範囲内か)
056:    		if ( ( 0 > back_r ) || ( 255 < back_r ) ) {
057:    			System.out.println( "背景色Rの値が範囲外です" );
058:    			return;
059:    		}
060:    		if ( ( 0 > back_g ) || ( 255 < back_g ) ) {
061:    			System.out.println( "背景色Gの値が範囲外です" );
062:    			return;
063:    		}
064:    		if ( ( 0 > back_b ) || ( 255 < back_b ) ) {
065:    			System.out.println( "背景色Bの値が範囲外です" );
066:    			return;
067:    		}

RGBの値が0~255の範囲の外だった場合には、エラーメッセージを出力し、return文mainメソッドを抜けています。

069:    		// 24ビットカラーの画像を作成
070:    		try {
071:    			img = new BufferedImage( width, height,
072:    						 BufferedImage.TYPE_INT_RGB );
073:    		} catch ( Exception e ) {
074:    			// 画像作成に失敗したときの処理
075:    			e.printStackTrace();
076:    			return;
077:    		}

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メソッドを抜けるようにしています。

079:    		// 背景色で画像全体を塗り潰し
080:    		Graphics2D g = (Graphics2D)img.getGraphics();
081:    		g.setColor( new Color( back_r, back_g, back_b ) );
082:    		g.fillRect( 0, 0, width, height );

img.getGraphics()でグラフックスコンテキストを取得し、指定した背景色で塗り潰し矩形画像全体に描画しています。

変数back_r、back_g、back_bで作成したColorGraphics.setColorに渡して、それをGraphics.fillRectメソッドを呼んで矩形を表示しています。

g.fillRect( 0, 0, width, height );は、左上の座標が(0,0)で幅がwidth、高さがheightの矩形を描画することなので、結果として画像全体が矩形で塗り潰されることになります。メソッド引数は以下を参考にしてください。

Colorコンストラクタ

Color( int r, int g, int b )
■赤緑青の値を使って、不透明なsRGBカラーを生成します。
  パラメータ r : 赤の値(0-255)
        g : 緑の値(0-255)
        b : 青の値(0-255)
Color( int r, int g, int b, int a )
■赤緑青とアルファの値を使って、sRGBカラーを生成します。
  パラメータ r : 赤の値(0-255)
        g : 緑の値(0-255)
        b : 青の値(0-255)
        a : アルファ値(0-255)

Graphics.setColorメソッド

public abstract void setColor( Color c )
■このグラフィックスコンテキストの現在の色を、指定された色に設定します。

  パラメータ c : 色

  戻り値     なし

Graphics.fillRectメソッド

public abstract void fillRect( int x, int y, int width, int height )
■指定された矩形(長方形)を塗りつぶします。

  パラメータ x      : 描画する矩形の左上隅のx座標
        y      : 描画する矩形の左上隅のy座標
        width  : 描画する矩形の幅
        height : 描画する矩形の高さ

  戻り値     なし

084:    		// 24ビットカラーの画像を作成
085:    		try {
086:    			// imgをoutname(出力PNG)に保存
087:    			result = ImageIO.write( img, "png", new File( outname ) );
088:    		} catch ( Exception e ) {
089:    			// outname(出力PNG)の保存に失敗したときの処理
090:    			e.printStackTrace();
091:    			return;
092:    		}

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を返します。

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

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

以上です。

■関連コンテンツ

画像の新規作成 画像を新しく作成する方法について解説
画像の色 画像の色について解説
画像ファイル形式 画像ファイル形式について解説
値のコンソール表示 print()、println()とは?
return文 メソッドの戻り値
Javaの変数 Javaで扱う変数について解説
画素について説明-画像

画素

画素とは、デジタル画像データを構成している色情報を持った点のことです。

光と色の3原色の考え方を解説-画像

光と色の3原色

光の3色(RGB)の混合と、インクの3色(CMY)の混合の考え方を説明しています。

■新着情報

2022.07.07 外部プログラムの実行 exeファイル実行
2022.07.06 完全数 6=1+2+3

■広告

 

 

 

 

 

スッキリわかるJava入門第3版 [ 中山清喬 ]

価格:2,860円
(2021/6/18 14:32時点)
感想(6件)

 

 

 

 

Topへ