2019/03/04 公開
・市松模様
画像サイズと黒と白の格子のピクセル幅を指定することで、黒と白の市松模様画像を作成します。ここで紹介するプログラムで出力する画像の形式は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 を構築します。 パラメータ 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( "正常に終了しました" );
全ての処理が正常終了すると、ここまで処理が実行されます。
以上です。
■他の市松模様の表現
市松模様(テキスト版) | 市松模様のテキスト表示方法を紹介 |
■関連コンテンツ
模様の描画 | いろいろな模様の描画方法を紹介 |
画像ファイル形式 | 画像ファイル形式について解説 |
色をARGB値に分解 | 色情報→ARGB |
タイル画像の素材 | フリーの素材を提供 |
■新着情報
2022.07.07 | 外部プログラムの実行 | exeファイル実行 |
2022.07.06 | 完全数 | 6=1+2+3 |
■広告