ゆるゆるプログラミング

・水平線模様

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

水平線模様画像水平線模様

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

Pattern_Line000.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_Line000 {
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_Line000 [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:    		for ( y = 0; y < h; ++ y ) {
066:    			for ( x = 0; x < w; ++ x ) {
067:    				// 黒か白かの判定
068:    				if ( ( y % ( w_b + w_w ) ) < w_b )
069:    					r = g = b = 0;
070:    				else
071:    					r = g = b = 255;
072:    
073:    				// r,g,bの色を合成
074:    				color = ( r << 16 ) + ( g << 8 ) + b;
075:    
076:    				// 合成した色を(x,y)に設定
077:    				img.setRGB( x, y, color );
078:    			}
079:    		}
080:    
081:    		try {
082:    			// imgをoutname(出力PNG)に保存
083:    			boolean result;
084:    			result = ImageIO.write( img, "PNG", new File( outname ) );
085:    		} catch ( Exception e ) {
086:    			// outname(出力PNG)の保存に失敗したときの処理
087:    			e.printStackTrace();
088:    			return;
089:    		}
090:    
091:    		// 正常に終了
092:    		System.out.println( "正常に終了しました" );
093:    	}
094:    }

Pattern_Line000の実行例

java Pattern_Line000 line000.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_Line000 {

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

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_Line000 [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:    		for ( y = 0; y < h; ++ y ) {
066:    			for ( x = 0; x < w; ++ x ) {
067:    				// 黒か白かの判定
068:    				if ( ( y % ( w_b + w_w ) ) < w_b )
069:    					r = g = b = 0;
070:    				else
071:    					r = g = b = 255;
072:    
073:    				// r,g,bの色を合成
074:    				color = ( r << 16 ) + ( g << 8 ) + b;
075:    
076:    				// 合成した色を(x,y)に設定
077:    				img.setRGB( x, y, color );
078:    			}
079:    		}

画像の中の全てのピクセルの座標(x,y)を参照するループをつくり、その座標の色が黒か白かを判定していきます。判定した色を(x,y)に代入していきます。 判定は、y座標を(w_b + w_w)ピクセルで割った余りがw_bより小さい場合に黒色、w_b以上の場合に白色にします。下図を参考にしてください。y座標を(w_b + w_w)で割った余りは周期的に0~(w_b + w_w) - 1の値になります。これら値のうち、0~w_b - 1が黒になり、w_b~(w_b + w_w) - 1が白となります。

水平線模様の作り方 

081:    		try {
082:    			// imgをoutname(出力PNG)に保存
083:    			boolean result;
084:    			result = ImageIO.write( img, "PNG", new File( outname ) );
085:    		} catch ( Exception e ) {
086:    			// outname(出力PNG)の保存に失敗したときの処理
087:    			e.printStackTrace();
088:    			return;
089:    		}

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

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

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

■関連コンテンツ

模様の描画 いろいろな模様の描画方法を紹介

■新着情報

2019.04.30 放射状模様 放射状模様の画像作成方法を紹介
2019.04.05 ストップウォッチ その1 単純なストップウォッチクラスの作り方を解説
2019.04.05 ストップウォッチ その2 ストップウォッチクラスの作り方を解説
2019.04.04 エッジ(境界)検出 カラー画像をN値化する方法について解説

■広告

法人向けのETC専用カード

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

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

 

 

 

 

 

 

 

Topへ