ゆるゆるプログラミング

・市松模様

画像サイズと黒と白の格子のピクセル幅を指定することで、黒と白の市松模様画像を作成します。ここで紹介するプログラムで出力する画像の形式はPNGファイルです。

市松模様は、格子模様の一種で2色の正方形または長方形を交互に配置した模様です。2020年東京オリンピック/パラリンピックのエンブレムにもこの市松模様が使われています。

市松模様画像市松模様

上の画像の例は、画像サイズ:256x256、セル幅(格子):32で作成したものです。

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

Pattern_Ichimatsuの実行例

java Pattern_Ichimatsu ichimatsu.png 256 256 32

ここからは、この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_Ichimatsu {

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

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

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

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

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

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

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

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

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

042:    		// 新しい画像を作成
043:    		// 24ビットカラーの画像を作成
044:    		try {
045:    			img = new BufferedImage( w, h,
046:    						 BufferedImage.TYPE_INT_RGB );
047:    		} catch ( Exception e ) {
048:    			// 画像作成に失敗したときの処理
049:    			e.printStackTrace();
050:    			return;
051:    		}

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

BufferedImageコンストラクタ

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

053:    		// 市松模様 画像作成
054:    		int    x, y;
055:    		int    color, r, g, b;	// 計算した色
056:    
057:    		for ( y = 0; y < h; ++ y ) {
058:    			for ( x = 0; x < w; ++ x ) {
059:    				if ( 0 == ( ( ( x / w_cell ) + ( y / w_cell ) ) % 2 ) )
060:    					r = g = b = 0;
061:    				else
062:    					r = g = b = 255;
063:    					
064:    				// rgbを合成
065:    				color = ( r << 16 ) + ( g << 8 ) + b;
066:    				// 色を設定
067:    				img.setRGB( x, y, color );
068:    			}
069:    		}

画像の中の全てのピクセルの座標(x,y)を参照するループをつくり、その座標の色が黒か白かを判定していきます。判定した色を(x,y)に代入していきます。 x座標をセル幅(w_cell)で割った値とy座標をセル幅(w_cell)で割った値を足して2で割った余りが0であれば黒色、1であれば白色と判定します。

071:    		try {
072:    			// imgをoutname(出力PNG)に保存
073:    			boolean result;
074:    			result = ImageIO.write( img, "PNG", new File( outname ) );
075:    		} catch ( Exception e ) {
076:    			// outname(出力PNG)の保存に失敗したときの処理
077:    			e.printStackTrace();
078:    			return;
079:    		}

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

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

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

■他の市松模様の表現

市松模様(テキスト版) 市松模様のテキスト表示方法を紹介

■関連コンテンツ

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

■新着情報

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

■広告

法人向けのETC専用カード

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

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

 

 

 

 

 

 

 

Topへ