2019/02/26 公開
・垂直線模様
画像サイズと黒と白のピクセル幅を指定することで、黒と白の垂直線を交互に描画した画像を作成します。ここで紹介するプログラムで出力する画像の形式はPNGファイルです。

上の画像の例は、画像サイズ:256x256、黒のピクセル幅:12、白のピクセル幅:16で作成したものです。
Pattern_Line090.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_Line090 { 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_Line090 [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 ( ( x % ( 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_Line090の実行例
java Pattern_Line090 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_Line090 {
クラス名を、Pattern_Line090としています。
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_Line090 [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 を構築します。 パラメータ 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 ( ( x % ( 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)を参照する2重ループをつくり、その座標の色が黒か白かを判定していきます。判定した色を(x,y)に代入していきます。 判定は、x座標を(w_b + w_w)ピクセルで割った余りがw_bより小さい場合に黒色、w_b以上の場合に白色にします。下図を参考にしてください。x座標を(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( "正常に終了しました" );
全ての処理が正常終了すると、ここまで処理が実行されます。
以上です。
■テキストの縦縞模様
縦縞模様(テキスト版) | 縦縞模様のテキスト表示方法を紹介 |
■関連コンテンツ
模様の描画 | いろいろな模様の描画方法を紹介 |
画像ファイル形式 | 画像ファイル形式について解説 |
タイル画像の素材 | フリーの素材を提供 |
![]() |
for文繰り返し処理に使用するfor文をJavaのソースコードを使って説明しています。 |
![]() |
多重ループfor文などのループの中にループをいれたプログラムの構造、多重ループについて説明しています。 |
![]() |
剰余(余り)計算剰余(余り)をを計算するプログラムの紹介と、その結果を表示する方法を解説 |
![]() |
if文条件による処理の分岐に使用するif文について解説 |
■新着情報
2022.07.07 | 外部プログラムの実行 | exeファイル実行 |
2022.07.06 | 完全数 | 6=1+2+3 |
■広告
