ゆるゆるプログラミング

・テーブルによる色変換 その3

ここでは、色変換テーブルを使った色変換のJavaソースコードのメイン部分を上から順番に解説していきます。

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

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

108:    		// 結果格納フラグ
109:    		boolean result;
110:    		// 色変換モード
111:    		int mode;
112:    		// ファイル名
113:    		String inname, outname;
114:    		// 画像格納クラス
115:    		BufferedImage img = null;

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

117:    		// 入力した引数が3つ以上かを調べる
118:    		if ( 3 > args.length ) {
119:    			// 入力した引数が3つ未満の場合、使用方法を表示する
120:    			System.out.println( "ColorConversion [入力JPG][出力JPG][モード]" );
121:    			return;
122:    		}

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

124:    		// 入力JPEG名をinnameに代入(拡張子".jpg"省略なし)
125:    		inname  = args[ 0 ];
126:    		// 出力JPEG名をoutnameに代入(拡張子".jpg"省略なし)
127:    		outname = args[ 1 ];
128:    
129:    		// モードをmodeに代入
130:    		try {
131:    			// 引数を変換し、モードに代入
132:    			mode = Integer.valueOf( args[ 2 ] );
133:    		}
134:    		catch( NumberFormatException ne )
135:    		{
136:    			System.out.println( "引数が不正です" );
137:    			return;
138:    		}

与えられた引数をそれぞれ、入力JPEGファイル名、出力JPEGファイル名、モードを格納する変数に代入しています。

140:    		// JPEGの読み込み
141:    		try {
142:    			// inname(入力JPEG)を読み込んでimgにセット
143:    			img = ImageIO.read( new File( inname ) );
144:    		} catch (Exception e) {
145:    			// inname(入力JPEG)の読み込みに失敗したときの処理
146:    			 e.printStackTrace();
147:    			return;
148:    		}

入力JPEG名の変数(inname)を読み込んで、BufferedImageクラスのimgに格納しています。この処理には、ImageIOクラスreadメソッドを使います。

ImageIO.readメソッド

public static BufferedImage read( File input ) throws IOException
■Fileオブジェクトを復元した結果をBufferedImageに格納します。

  パラメータ input : Fileオブジェクト

  戻り値     inputを復元したBufferedImageaを返します。

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

151:    		// 画像の色の持ち方をチェック
152:    		if ( BufferedImage.TYPE_3BYTE_BGR != img.getType() )
153:    		{
154:    			System.out.println( "対応していないカラーモデルです!("
155:    									 + inname +")" );
156:    			return;
157:    		}

BufferedImageクラスgetTypeメソッドで画像のイメージ型を取得しています。

BufferedImage.getTypeメソッド

public static int getType()
■イメージ型を返します。
  パラメータ なし

  戻り値     BufferedImage のイメージ型を返します。

159:    		// 色変換
160:    		int x, y;
161:    		int width, height;
162:    		int color, r, g, b;
163:    		int p;
164:    		int newcolor;

色変換処理で使う変数を宣言しています。

166:    		// 色変換テーブル
167:    		int[] colorconv_r = new int[ 256 ];
168:    		int[] colorconv_g = new int[ 256 ];
169:    		int[] colorconv_b = new int[ 256 ];

色変換テーブルを宣言しています。

172:    		// 色変換テーブル設定
173:    		setTable( colorconv_r, colorconv_g, colorconv_b, mode );

色変換テーブルにモードに対応した値を代入しています。

175:    		// 画像サイズの取得
176:    		width = img.getWidth();
177:    		height= img.getHeight();

widthに画像の幅(ピクセル)、heightに画像の高さ(ピクセル)を代入しています。

179:    		for ( y = 0; y < height; ++ y ) {
180:    			for ( x = 0; x < width; ++ x ) {

画像の中の全てのピクセルの座標を参照するループをつくっています。具体的には、変数yを0~height-1、変数xを0~width-1に変化させています。

181:    				// (x,y)の色を取得
182:    				color = img.getRGB( x, y );

ピクセル座標(x,y)の色を取得しています。

184:    				// 色をr,g,bに分解
185:    				r = ( color >> 16 ) & 0xff;
186:    				g = ( color >> 8 ) & 0xff;
187:    				b = color & 0xff;

変数colorに入っている色情報を赤(R)、緑(G)画、青(B)の成分に分解し、それぞれ変数r、g、bに代入しています。

189:    				// r,g,bの色をテーブルで変換
190:    				r = colorconv_r[ r ];
191:    				g = colorconv_g[ g ];
192:    				b = colorconv_b[ b ];

r、g、bの値を色変換テーブル配列)の添え字とし、テーブルの値をr、g、bに代入しています。

194:    				// r,g,bの色を合成
195:    				newcolor = ( r << 16 ) + ( g << 8 ) + b;

赤(R)、緑(G)、青(B)の成分rgbを合成して、新しい色(変数newcolor)を作成しています。

197:    				// 合成した色を(x,y)に設定
198:    				img.setRGB( x, y, newcolor );

新しい色(変数newcolor)を(x,y)に代入します。

202:    		try {
203:    			// imgをoutname(出力JPEG)に保存
204:    			result = ImageIO.write( img, "jpeg", new File( outname ) );
205:    		} catch ( Exception e ) {
206:    			// outname(出力JPEG)の保存に失敗したときの処理
207:    			e.printStackTrace();
208:    			return;
209:    		}

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

ImageIO.writeメソッド

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

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

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

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

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

■関連コンテンツ

テーブルによる色変換 テーブルによる色の変換方法を解説
テーブルによる色変換 その2 テーブルによる色の変換方法を解説(その2)
光と色の3原色 光と色の3原色の考え方を解説
switch文 式による処理の分岐に使用するswitch文について解説

■新着情報

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

■広告

法人向けのETC専用カード

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

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

Topへ