2019/06/14 公開
・円模様1
ここでは、同じサイズの円を縦と横方向に同じ間隔で並べて出来る模様の画像を作成する方法を紹介します。ここで紹介するプログラムで出力する画像の形式はPNGファイルです。

上の画像の例は、画像サイズ:256x256、円のピクセル半径:32、ピクセル線幅:4で作成したものです。
Pattern_Circle01.java ← クリックしてダウンロードページに移動001: import java.awt.image.BufferedImage; 002: import java.awt.Graphics2D; 003: import java.awt.Color; 004: import java.awt.BasicStroke; 005: import java.io.File; 006: import javax.imageio.ImageIO; 007: 008: public class Pattern_Circle01 { 009: public static void main(String[] args) { 010: // 変数宣言 011: int w, h; // 画像サイズ 012: int radius; // 円の半径 013: int line_w; // 線幅 014: String outname; // 出力ファイル名 015: BufferedImage img = null; // 画像格納クラス 016: 017: // 入力した引数が5以上かを調べる 018: if ( 5 > args.length ) { 019: // 入力した引数が5未満の場合、使用方法を表示する 020: System.out.println( 021: "Pattern_Circle01 [PNG名] [画像幅] [画像高] [円半径] [線幅]" ); 022: return; 023: } 024: 025: try { 026: // 引数を変換し、画像の幅と高さをwとhに代入 027: w = Integer.valueOf( args[ 1 ] ); 028: h = Integer.valueOf( args[ 2 ] ); 029: 030: // 引数を変換し、円の半径radiusに代入 031: radius = Integer.valueOf( args[ 3 ] ); 032: if ( 1 > radius ) { 033: System.out.println( "円の半径に1以上を指定!" ); 034: return; 035: } 036: 037: // 引数を変換し、線幅line_wに代入 038: line_w = Integer.valueOf( args[ 4 ] ); 039: if ( 1 > line_w ) { 040: System.out.println( "線幅に1以上を指定!" ); 041: return; 042: } 043: } 044: catch( NumberFormatException ne ) 045: { 046: System.out.println( "引数が不正です" ); 047: return; 048: } 049: // 出力PNG名をoutnameに代入(拡張子".png"省略なし) 050: outname = args[ 0 ]; 051: 052: // 新規画像を作成 053: img = new BufferedImage( w, h, BufferedImage.TYPE_INT_RGB ); 054: Graphics2D g = (Graphics2D)img.getGraphics(); 055: g.setColor( Color.white ); // 背景色を白に設定 056: g.fillRect( 0, 0, w, h ); // 背景で画像全体を塗る 057: 058: // 模様を作成 059: int x, y; 060: int pitch; 061: 062: // pitch直径の値を代入 063: pitch = radius * 2; 064: 065: // 線の色を黒に設定 066: g.setColor( Color.black ); 067: 068: // 線幅をline_wに設定 069: g.setStroke( new BasicStroke( line_w ) ); 070: for ( y = 0; y <= ( h + radius ); y = y + pitch ) { 071: for ( x = 0; x <= ( w + radius ); x = x + pitch ) { 072: g.drawOval( x - radius, y - radius, radius * 2, radius * 2 ); 073: } 074: } 075: 076: 077: try { 078: // imgをoutname(出力PNG)に保存 079: boolean result; 080: result = ImageIO.write( img, "PNG", new File( outname ) ); 081: } catch ( Exception e ) { 082: // outname(出力PNG)の保存に失敗したときの処理 083: e.printStackTrace(); 084: return; 085: } 086: 087: // 正常に終了 088: System.out.println( "正常に終了しました" ); 089: } 090: }
Pattern_Circle01の実行例
java Pattern_Circle01 circle01.png 256 256 32 4
ここからは、このJavaソースコードを上から順番に解説していきます。
001: import java.awt.image.BufferedImage; 002: import java.awt.Graphics2D; 003: import java.awt.Color; 004: import java.awt.BasicStroke; 005: import java.io.File; 006: import javax.imageio.ImageIO;
Javaのクラスライブラリの中から「java.awt.image.BufferedImage」と「java.awt.Graphics2D」と「java.awt.Color」と「java.awt.BasicStroke」と「java.io.File」と「javax.imageio.ImageIO」というパッケージにあるクラスを、このプログラム内で使うために記述します。
008: public class Pattern_Circle01 {
クラス名を、Pattern_Circle01としています。
009: public static void main(String[] args) {
このmainメソッドからプログラムを実行します。
010: // 変数宣言 011: int w, h; // 画像サイズ 012: int radius; // 円の半径 013: int line_w; // 線幅 014: String outname; // 出力ファイル名 015: BufferedImage img = null; // 画像格納クラス
このプログラムで使う変数を宣言しています。
017: // 入力した引数が5以上かを調べる 018: if ( 5 > args.length ) { 019: // 入力した引数が5未満の場合、使用方法を表示する 020: System.out.println( 021: "Pattern_Circle01 [PNG名] [画像幅] [画像高] [円半径] [線幅]" ); 022: return; 023: }
5つ以上の引数が与えられたかをチェックし、5つ未満の場合に、使い方のメッセージを表示し、returnによってmainメソッドを抜けています。
025: try { 026: // 引数を変換し、画像の幅と高さをwとhに代入 027: w = Integer.valueOf( args[ 1 ] ); 028: h = Integer.valueOf( args[ 2 ] ); 029: 030: // 引数を変換し、円の半径radiusに代入 031: radius = Integer.valueOf( args[ 3 ] ); 032: if ( 1 > radius ) { 033: System.out.println( "円の半径に1以上を指定!" ); 034: return; 035: } 036: 037: // 引数を変換し、線幅line_wに代入 038: line_w = Integer.valueOf( args[ 4 ] ); 039: if ( 1 > line_w ) { 040: System.out.println( "線幅に1以上を指定!" ); 041: return; 042: } 043: } 044: catch( NumberFormatException ne ) 045: { 046: System.out.println( "引数が不正です" ); 047: return; 048: } 049: // 出力PNG名をoutnameに代入(拡張子".png"省略なし) 050: outname = args[ 0 ];
与えられた引数をそれぞれ、作成する画像の幅/高さ、円ピクセル半径、ピクセル線幅、出力PNG名を格納する変数に代入しています。画像の幅/高さ、円ピクセル半径、ピクセル線幅の引数はString型なので、Integerクラスを使ってint型に変換しています。
053: img = new BufferedImage( w, h, BufferedImage.TYPE_INT_RGB );
BufferedImageクラスのコンストラクタで、新しいBufferedImageを構築しています。
BufferedImageコンストラクタ
■新しい BufferedImage を構築します。 パラメータ width : 構築する画像の横ピクセル height : 構築する画像の縦ピクセル imageType : 構築する画像のイメージ形式
054: Graphics2D g = (Graphics2D)img.getGraphics(); 055: g.setColor( Color.white ); // 背景色を白に設定 056: g.fillRect( 0, 0, w, h ); // 背景で画像全体を塗る
img.getGraphics()でグラフックスコンテキストを取得し、背景を白で塗り潰しています。
ここで、グラフックスコンテキストを取得するとは、作成したBufferedImage imgに対してライン/円/多角形などのグラフィック描画を行うためのGraphics2Dクラスを取得することです。ここで取得したGraphics2Dクラスのgにグラフィック描画を行うとimgに反映されます。
BufferedImageクラスで作成した画像に、グラフィックを描画するための準備と考えるのが良いと思います。
058: // 模様を作成 059: int x, y; 060: int pitch;
模様を作成するための変数を宣言しています。
062: // pitch直径の値を代入 063: pitch = radius * 2;
int型の変数pitchには半径radisuを2倍した値、つまり直径の値を代入しています。
これは、隣り合った円の中心座標との距離を表しています。

065: // 線の色を黒に設定 066: g.setColor( Color.black );
描画する円の色を黒に設定しています。
Graphics.setColorメソッド
■このグラフィックスコンテキストの現在の色を、指定された色に設定します。 パラメータ c : 色 戻り値 なし
068: // 線幅をline_wに設定 069: g.setStroke( new BasicStroke( line_w ) );
描画する円の線幅をint型の変数line_wで指定した値に設定しています。
Graphics.setStrokeメソッド
■このグラフィックスコンテキストのストロークを設定します。 パラメータ s : ストローク 戻り値 なし
070: for ( y = 0; y <= ( h + radius ); y = y + pitch ) { 071: for ( x = 0; x <= ( w + radius ); x = x + pitch ) { 072: g.drawOval( x - radius, y - radius, radius * 2, radius * 2 ); 073: } 074: }
for文で2重ループを作成し、円を描画しています。変数xとyはそれぞれpitch(直径)の値が足されます。
ここでは、drawOvalメソッドの左隅の座標にxとyからradisu(半径)を引いた値、幅と高さにradius*2(直径)を引数として渡しています。これは座標(x,y)を中心として半径radiusの円を描画することを意味しています。
以下に、drawOvalの仕様を記載します。参考にしてください。
Graphics.drawOvalメソッド
■楕円の輪郭線を描きます。 パラメータ x : 描画する楕円の左上隅のx座標 y : 描画する楕円の左上隅のy座標 width : 描画する楕円の幅 height : 描画する楕円の高さ 戻り値 なし

中心座標を基準に円を描画するために、以下の計算を行います。

077: try { 078: // imgをoutname(出力PNG)に保存 079: boolean result; 080: result = ImageIO.write( img, "PNG", new File( outname ) ); 081: } catch ( Exception e ) { 082: // outname(出力PNG)の保存に失敗したときの処理 083: e.printStackTrace(); 084: return; 085: }
BufferedImageクラスのimgのメモリ内のデータを、出力PNG名の変数(outname)に格納されているファイル名で保存します。この場合は、PNGファイル名が不正であったり、保存先のHDDなどが存在していなかったり、空き容量が少ないなどが原因で処理が失敗する可能性があります。
087: // 正常に終了 088: System.out.println( "正常に終了しました" );
全ての処理が正常終了すると、ここまで処理が実行されます。
以上です。
■関連コンテンツ
模様の描画 | いろいろな模様の描画方法を紹介 |
画像ファイル形式 | 画像ファイル形式について解説 |
円を描く(テキスト版) | テキストを円を描く |
タイル画像の素材 | フリーの素材を提供 |
■新着情報
2022.07.07 | 外部プログラムの実行 | exeファイル実行 |
2022.07.06 | 完全数 | 6=1+2+3 |
■広告
