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

2019/02/26 公開

・十字線模様

画像サイズと黒と白のピクセル幅を指定することで、黒と白の水平線と垂直線が交差した画像を作成します。ここで紹介するプログラムで出力する画像の形式はPNGファイルです。

十字線模様画像十字線模様

上の画像の例は、画像サイズ:256x256、黒のピクセル幅:12、白のピクセル幅:16で作成したものです。

Pattern_CrossLine000.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 Pattern_CrossLine000 {
007:    	public static void main( String[] args ) {
008:    		// 変数宣言
009:    		int w, h;	// 画像サイズ
010:    		int w_b;	// 黒の幅
011:    		int w_w;	// 白の幅
012:    		String outname;	// 出力ファイル名
013:    		BufferedImage img = null;	// 画像格納クラス
014:    
015:    		// 入力した引数が5以上かを調べる
016:    		if ( 5 > args.length ) {
017:    			// 入力した引数が5未満の場合、使用方法を表示する
018:    			System.out.println( 
019:    				"Pattern_CrossLine000 [PNG] [画像幅] [画像高] [黒幅] [白幅]" );
020:    			return;
021:    		}
022:    
023:    		try {
024:    			// 引数を変換し、画像の幅と高さをwとhに代入
025:    			w =  Integer.valueOf( args[ 1 ] );
026:    			h =  Integer.valueOf( args[ 2 ] );
027:    
028:    			// 引数を変換し、黒の幅w_bに代入
029:    			w_b = Integer.valueOf( args[ 3 ] );
030:    			if ( 1 > w_b ) {
031:    				System.out.println( "黒幅に1以上を指定!" );
032:    				return;
033:    			}
034:    
035:    			// 引数を変換し、白の幅w_wに代入
036:    			w_w = Integer.valueOf( args[ 4 ] );
037:    			if ( 1 > w_w ) {
038:    				System.out.println( "白幅に1以上を指定!" );
039:    				return;
040:    			}
041:    		}
042:    		catch( NumberFormatException ne )
043:    		{
044:    			System.out.println( "引数が不正です" );
045:    			return;
046:    		}
047:    		// 出力PNG名をoutnameに代入(拡張子".png"省略なし)
048:    		outname = args[ 0 ];
049:    
050:    		// 新しい画像を作成
051:    		// 24ビットカラーの画像を作成
052:    		try {
053:    			img = new BufferedImage( w, h,
054:    						 BufferedImage.TYPE_INT_RGB );
055:    		} catch ( Exception e ) {
056:    			// 画像作成に失敗したときの処理
057:    			e.printStackTrace();
058:    			return;
059:    		}
060:    
061:    		// クロス画像作成
062:    		int    x, y;
063:    		int    color, r, g, b;	// 計算した色
064:    
065:    
066:    		// 全部を白色にする
067:    		r = g = b = 255;
068:    		color = ( r << 16 ) + ( g << 8 ) + b;
069:    		for ( y = 0; y < h; ++ y ) {
070:    			for ( x = 0; x < w; ++ x ) {
071:    				// 白色を設定
072:    				img.setRGB( x, y, color );
073:    			}
074:    		}
075:    
076:    
077:    		// クロス部分を黒色にする
078:    		r = g = b = 0;
079:    		color = ( r << 16 ) + ( g << 8 ) + b;
080:    		for ( y = 0; y < h; ++ y ) {
081:    			for ( x = 0; x < w; ++ x ) {
082:    				// 黒の判定
083:    				if ( ( ( x % ( w_b + w_w ) ) < w_b )
084:    							|| ( ( y % ( w_b + w_w ) ) < w_b ) )
085:    					 img.setRGB( x, y, color );
086:    			}
087:    		}
088:    
089:    		try {
090:    			// imgをoutname(出力PNG)に保存
091:    			boolean result;
092:    			result = ImageIO.write( img, "PNG", new File( outname ) );
093:    		} catch ( Exception e ) {
094:    			// outname(出力PNG)の保存に失敗したときの処理
095:    			e.printStackTrace();
096:    			return;
097:    		}
098:    
099:    		// 正常に終了
100:    		System.out.println( "正常に終了しました" );
101:    	}
102:    }

Pattern_CrossLine000の実行例

java Pattern_CrossLine000 line090.png 256 256 12 16

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

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」というパッケージにあるクラスを、このプログラム内で使うために記述します。この記述により、BufferedImageクラスImageIOクラスが利用できるようになります。

006:    public class Pattern_CrossLine000 {

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

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

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

008:    		// 変数宣言
009:    		int w, h;	// 画像サイズ
010:    		int w_b;	// 黒の幅
011:    		int w_w;	// 白の幅
012:    		String outname;	// 出力ファイル名
013:    		BufferedImage img = null;	// 画像格納クラス

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

015:    		// 入力した引数が5以上かを調べる
016:    		if ( 5 > args.length ) {
017:    			// 入力した引数が5未満の場合、使用方法を表示する
018:    			System.out.println( 
019:    				"Pattern_CrossLine000 [PNG] [画像幅] [画像高] [黒幅] [白幅]" );
020:    			return;
021:    		}

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

023:    		try {
024:    			// 引数を変換し、画像の幅と高さをwとhに代入
025:    			w =  Integer.valueOf( args[ 1 ] );
026:    			h =  Integer.valueOf( args[ 2 ] );
027:    
028:    			// 引数を変換し、黒の幅w_bに代入
029:    			w_b = Integer.valueOf( args[ 3 ] );
030:    			if ( 1 > w_b ) {
031:    				System.out.println( "黒幅に1以上を指定!" );
032:    				return;
033:    			}
034:    
035:    			// 引数を変換し、白の幅w_wに代入
036:    			w_w = Integer.valueOf( args[ 4 ] );
037:    			if ( 1 > w_w ) {
038:    				System.out.println( "白幅に1以上を指定!" );
039:    				return;
040:    			}
041:    		}
042:    		catch( NumberFormatException ne )
043:    		{
044:    			System.out.println( "引数が不正です" );
045:    			return;
046:    		}
047:    		// 出力PNG名をoutnameに代入(拡張子".png"省略なし)
048:    		outname = args[ 0 ];

与えられた引数をそれぞれ、作成する画像の幅/高さ、黒ピクセルの幅、白ピクセルの幅、出力PNG名を格納する変数に代入しています。画像の幅/高さ、黒ピクセルの幅、白ピクセルの幅の引数String型なので、Integerクラスを使ってint型に変換しています。

050:    		// 新しい画像を作成
051:    		// 24ビットカラーの画像を作成
052:    		try {
053:    			img = new BufferedImage( w, h,
054:    						 BufferedImage.TYPE_INT_RGB );
055:    		} catch ( Exception e ) {
056:    			// 画像作成に失敗したときの処理
057:    			e.printStackTrace();
058:    			return;
059:    		}

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

BufferedImageコンストラクタ

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

061:    		// クロス画像作成
062:    		int    x, y;
063:    		int    color, r, g, b;	// 計算した色
064:    
065:    
066:    		// 全部を白色にする
067:    		r = g = b = 255;
068:    		color = ( r << 16 ) + ( g << 8 ) + b;
069:    		for ( y = 0; y < h; ++ y ) {
070:    			for ( x = 0; x < w; ++ x ) {
071:    				// 白色を設定
072:    				img.setRGB( x, y, color );
073:    			}
074:    		}

画像の中の全てのピクセルの座標(x,y)を参照するループをつくり、画像全体を白色にします。

077:    		// クロス部分を黒色にする
078:    		r = g = b = 0;
079:    		color = ( r << 16 ) + ( g << 8 ) + b;
080:    		for ( y = 0; y < h; ++ y ) {
081:    			for ( x = 0; x < w; ++ x ) {
082:    				// 黒の判定
083:    				if ( ( ( x % ( w_b + w_w ) ) < w_b )
084:    							|| ( ( y % ( w_b + w_w ) ) < w_b ) )
085:    					 img.setRGB( x, y, color );
086:    			}
087:    		}

画像の中の全てのピクセルの座標(x,y)を参照するループをつくり、その座標の色が黒か白かを判定していきます。判定した色を(x,y)に代入していきます。 判定は、x座標を(w_b + w_w)ピクセルで割った余りがw_bより小さい場合、またはy座標を(w_b + w_w)ピクセルで割った余りがw_bより小さい場合に黒色にします。下図を参考にしてください。

十字線模様の作り方 

089:    		try {
090:    			// imgをoutname(出力PNG)に保存
091:    			boolean result;
092:    			result = ImageIO.write( img, "PNG", new File( outname ) );
093:    		} catch ( Exception e ) {
094:    			// outname(出力PNG)の保存に失敗したときの処理
095:    			e.printStackTrace();
096:    			return;
097:    		}

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

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

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

以上です。

■関連コンテンツ

模様の描画 いろいろな模様の描画方法を紹介
画像ファイル形式 画像ファイル形式について解説
タイル画像の素材 フリーの素材を提供
繰り返し処理に使用するfor文について解説-画像

for文

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

剰余(余り)を計算した結果を表示するプログラムについて解説-画像

剰余(余り)計算

剰余(余り)をを計算するプログラムの紹介と、その結果を表示する方法を解説

■新着情報

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

■広告

 

 

 

 

 

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

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

 

 

 

 

Topへ