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

2020/10/06 公開

・画像のミラー反転

画像の左と右を反転する画像処理Javaソースコードを解説します。

元の画像元の画像      鏡画像ミラー反転画像

上の画像変換の例は、画像ミラー反転したもので、左右が入れ替わっています。

ここで紹介するミラー反転は、画像座標の各y座標画素の並びの順番を入れ替える方法で行います。

それでは、Javaソースコードをみていきましょう。

MirrorInversion.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 MirrorInversion {
007:    	public static void main( String[] args ) {
008:    		// 結果格納フラグ
009:    		boolean result;
010:    		// ファイル名
011:    		String inname, outname;
012:    		// 画像格納クラス
013:    		BufferedImage img = null;
014:    
015:    		// 入力した引数が2つ以上かを調べる
016:    		if ( 2 > args.length ) {
017:    			// 入力した引数が2つ未満の場合、使用方法を表示する
018:    			System.out.println( "MirrorInverse [入力JPEG名]  [出力JPEG名]" );
019:    			return;
020:    		}
021:    
022:    		// 入力JPEG名をinnameに代入(拡張子".jpg"省略なし)
023:    		inname  = args[ 0 ];
024:    		// 出力JPEG名をoutnameに代入(拡張子".jpg"省略なし)
025:    		outname = args[ 1 ];
026:    
027:    		try {
028:    			// inname(入力JPEG)を読み込んでimgにセット
029:    			img = ImageIO.read( new File( inname ) );
030:    		} catch (Exception e) {
031:    			// inname(入力JPEG)の読み込みに失敗したときの処理
032:    			 e.printStackTrace();
033:    			return;
034:    		}
035:    
036:    		// 画像の色の持ち方をチェック
037:    		if ( BufferedImage.TYPE_3BYTE_BGR != img.getType() )
038:    		{
039:    			System.out.println( "対応していないカラーモデルです!("
040:    									 + inname +")" );
041:    			return;
042:    		}
043:    
044:    		// 変数を宣言
045:    		int x_s, x_e, y;	// ピクセル座標
046:    		int width, height;	// 画像サイズ
047:    		int color_s, color_e;	// 色
048:    
049:    		// 画像サイズの取得
050:    		width = img.getWidth();
051:    		height= img.getHeight();
052:    
053:    		// ミラー反転
054:    		for ( y = 0; y < height; ++ y ) {
055:    			// X座標の初期値を代入
056:    			x_s = 0;
057:    			x_e = width - 1;
058:    			while ( x_s < x_e ) {
059:    				// (x_s,y)の色を取得
060:    				color_s = img.getRGB( x_s, y );
061:    
062:    				// (x_e,y)の色を取得
063:    				color_e = img.getRGB( x_e, y );
064:    
065:    				// color_eを(x_s,y)に設定
066:    				img.setRGB( x_s, y, color_e );
067:    
068:    				// color_sを(x_e,y)に設定
069:    				img.setRGB( x_e, y, color_s );
070:    
071:    				// X座標を更新
072:    				++ x_s;
073:    				-- x_e;
074:    			}
075:    		}
076:    
077:    		try {
078:    			// imgをoutname(出力JPEG)に保存
079:    			result = ImageIO.write( img, "jpeg", new File( outname ) );
080:    		} catch ( Exception e ) {
081:    			// outname(出力JPEG)の保存に失敗したときの処理
082:    			e.printStackTrace();
083:    			return;
084:    		}
085:    
086:    		// 正常に終了
087:    		System.out.println( "正常に終了しました" );
088:    	}
089:    }

MirrorInversionを実行

java MirrorInversion sampleimage001_400x320.jpg mirrorInversion.jpg

1つ目の引数で渡したJPEGファイルを反転し、2つ目の引数で指定したJPEGファイル名で保存します。

実行結果

・元の画像(sampleimage001_400x320.jpg)

元画像

・ミラー反転後の画像(mirrorInversion.jpg)

>ミラー反転画像

画像の左右が反転しました。

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

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 MirrorInversion {

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

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

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

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

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

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

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

022:    		// 入力JPEG名をinnameに代入(拡張子".jpg"省略なし)
023:    		inname  = args[ 0 ];
024:    		// 出力JPEG名をoutnameに代入(拡張子".jpg"省略なし)
025:    		outname = args[ 1 ];

与えられた引数をそれぞれ、入力JPEG名の変数(inname)、出力JPEG名の変数(outname)代入しています。

027:    		try {
028:    			// inname(入力JPEG)を読み込んでimgにセット
029:    			img = ImageIO.read( new File( inname ) );
030:    		} catch (Exception e) {
031:    			// inname(入力JPEG)の読み込みに失敗したときの処理
032:    			 e.printStackTrace();
033:    			return;
034:    		}

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

036:    		// 画像の色の持ち方をチェック
037:    		if ( BufferedImage.TYPE_3BYTE_BGR != img.getType() )
038:    		{
039:    			System.out.println( "対応していないカラーモデルです!("
040:    									 + inname +")" );
041:    			return;
042:    		}

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

BufferedImage.getTypeメソッド

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

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

044:    		// 変数を宣言
045:    		int x_s, x_e, y;	// ピクセル座標
046:    		int width, height;	// 画像サイズ
047:    		int color_s, color_e;	// 色

画像の回転で使う変数を宣言しています。

049:    		// 画像サイズの取得
050:    		width = img.getWidth();
051:    		height= img.getHeight();

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

053:    		// ミラー反転
054:    		for ( y = 0; y < height; ++ y ) {

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

055:    			// X座標の初期値を代入
056:    			x_s = 0;
057:    			x_e = width - 1;

画素の色を入れ替える最初の左端の座標x_sと、右端の座標x_eに初期値を代入しています。

058:    			while ( x_s < x_e ) {

x_sがx_eより小さいときに繰り返すループを作成しています。

059:    				// (x_s,y)の色を取得
060:    				color_s = img.getRGB( x_s, y );
061:    
062:    				// (x_e,y)の色を取得
063:    				color_e = img.getRGB( x_e, y );
064:    
065:    				// color_eを(x_s,y)に設定
066:    				img.setRGB( x_s, y, color_e );
067:    
068:    				// color_sを(x_e,y)に設定
069:    				img.setRGB( x_e, y, color_s );

(x_s,y)と(x_e,y)の色を入れ替えます。具体的には、ピクセル座標(x_s,y)にcolor_eを設定、ピクセル座標(x_e,y)にcolor_sを設定しています。

071:    				// X座標を更新
072:    				++ x_s;
073:    				-- x_e;

x_sに1をインクリメント(1を足す)、x_eをデクリメント(1を引く)しています。

077:    		try {
078:    			// imgをoutname(出力JPEG)に保存
079:    			result = ImageIO.write( img, "jpeg", new File( outname ) );
080:    		} catch ( Exception e ) {
081:    			// outname(出力JPEG)の保存に失敗したときの処理
082:    			e.printStackTrace();
083:    			return;
084:    		}

BufferedImageクラスのimgのメモリ内のデータを、出力JPEG名の変数(outname)に格納されているファイル名で保存します。この場合は、JPEGファイル名が不正であったり、保存先の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を返します。

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

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

以上です。

■関連コンテンツ

画像の色 画像の色について解説
画像ファイル形式 画像ファイル形式について解説
光と色の3原色の考え方を解説-画像

光と色の3原色

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

画素について説明-画像

画素

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

画像を上下反転する方法-画像

画像の上下反転

フルカラー(24bit)画像の上と下を反転する方法を解説しています。

繰り返し処理に使用するfor文について解説-画像

for文

繰り返し処理に使用するfor文をJavaのソースコードを使って説明しています。

繰り返し処理に使用するwhile文について解説-画像

while文

繰り返し処理に使用するwhile文について解説

for文の中にfor文-画像

多重ループ

for文などのループの中にループをいれたプログラムの構造、多重ループについて説明しています。

■新着情報

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

■広告

 

 

 

 

 

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

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

 

 

 

 

Topへ