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

2020/03/23 公開

・簡単な画像処理プログラム

ここでは、画像処理プログラム簡単な例として、JPEGフォーマット画像ファイル(.jpg)を、PNGフォーマット画像ファイル(.png)に変換するソースコードを解説します。

Javaには、ImageIOクラスという、便利なクラスがあります。このクラスを利用すれば、様々な種類の画像ファイルの読み込みと保存を行うことができます。

読み込まれた画像は、BufferedImageクラスで確保したメモリ上に格納されており、このメモリの色データを操作することによって画像処理を行うことができます。以下のソースコードは、BufferedImageクラスに読み込んだ画像を、ファイルに保存するだけのシンプルなソースコードですが、後で解説をする画像処理の基礎になります。

JPG2PNG.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 JPG2PNG {
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( "JPG2PNG [入力JPEG名]  [出力PNG名]" );
019:    			return;
020:    		}
021:    
022:    		// 入力JPEG名をinnameに代入(拡張子".jpg"省略なし)
023:    		inname  = args[ 0 ];
024:    		// 出力PNG名をoutnameに代入(拡張子".png"省略なし)
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:    		try {
037:    			// imgをoutname(出力PNG)に保存
038:    			result = ImageIO.write( img, "png", new File( outname ) );
039:    		} catch ( Exception e ) {
040:    			// outname(出力PNG)の保存に失敗したときの処理
041:    			e.printStackTrace();
042:    			return;
043:    		}
044:    
045:    		// 正常に終了
046:    		System.out.println( "正常に終了しました" );
047:    	}
048:    }

JPG2PNGを実行

C:\talavax\javasample>java JPG2PNG sampleimage001.jpg sampleimage001.png

JPEGファイルPNGファイルに変換するために、上記のように2つの引数を渡します。1つ目は入力のJPEGファイル名で、2つ目は出力のPNGファイル名です。このソースコードの例では、拡張子(.jpg)(.png)を省略することはできません。

実行結果

正常終了しました。

変換に成功するとsampleimage001.pngが作られ、上記のメッセージを表示します。

次に、与えた引数が2つ未満の場合の実行結果について解説します。

JPG2PNGを引数なしで実行

C:\talavax\javasample>java JPG2PNG

実行結果

JPG2PNG [入力JPEG名] [出力PNG名]

引数が2つ未満の場合、プログラムの引数に何を渡せばよいかを表示するようにしています。

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

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

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

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( "JPG2PNG [入力JPEG名]  [出力PNG名]" );
019:    			return;
020:    		}

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

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

与えられた2つの引数をそれぞれ、入力JPEG名の変数(inname)と出力PNG名の変数(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:    		try {
037:    			// imgをoutname(出力PNG)に保存
038:    			result = ImageIO.write( img, "png", new File( outname ) );
039:    		} catch ( Exception e ) {
040:    			// outname(出力PNG)の保存に失敗したときの処理
041:    			e.printStackTrace();
042:    			return;
043:    		}

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

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

正常終了のメッセージを表示しています。全ての処理が正常終了すると、ここまで処理が実行されます。

■関連コンテンツ

画像ファイル形式 画像ファイル形式について解説
画像の座標系 画像の座標系について解説
光と色の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へ