2019/02/26 公開
・十字線模様
画像サイズと黒と白のピクセル幅を指定することで、黒と白の水平線と垂直線が交差した画像を作成します。ここで紹介するプログラムで出力する画像の形式はPNGファイルです。
上の画像の例は、画像サイズ:256x256、黒のピクセル幅:12、白のピクセル幅:16で作成したものです。
Pattern_CrossLine000.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_CrossLine000 { 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_CrossLine000 [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: 066: // 全部を白色にする 067: r = g = b = 255; 068: color = ( r << 16 ) + ( g << 8 ) + b; 069: for ( y = 0; y < h; ++ y ) { 070: for ( x = 0; x < w; ++ x ) { 071: // 白色を設定 072: img.setRGB( x, y, color ); 073: } 074: } 075: 076: 077: // クロス部分を黒色にする 078: r = g = b = 0; 079: color = ( r << 16 ) + ( g << 8 ) + b; 080: for ( y = 0; y < h; ++ y ) { 081: for ( x = 0; x < w; ++ x ) { 082: // 黒の判定 083: if ( ( ( x % ( w_b + w_w ) ) < w_b ) 084: || ( ( y % ( w_b + w_w ) ) < w_b ) ) 085: img.setRGB( x, y, color ); 086: } 087: } 088: 089: try { 090: // imgをoutname(出力PNG)に保存 091: boolean result; 092: result = ImageIO.write( img, "PNG", new File( outname ) ); 093: } catch ( Exception e ) { 094: // outname(出力PNG)の保存に失敗したときの処理 095: e.printStackTrace(); 096: return; 097: } 098: 099: // 正常に終了 100: System.out.println( "正常に終了しました" ); 101: } 102: }
Pattern_CrossLine000の実行例
java Pattern_CrossLine000 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_CrossLine000 {
クラス名を、Pattern_CrossLine000としています。
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_CrossLine000 [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: 066: // 全部を白色にする 067: r = g = b = 255; 068: color = ( r << 16 ) + ( g << 8 ) + b; 069: for ( y = 0; y < h; ++ y ) { 070: for ( x = 0; x < w; ++ x ) { 071: // 白色を設定 072: img.setRGB( x, y, color ); 073: } 074: }
画像の中の全てのピクセルの座標(x,y)を参照するループをつくり、画像全体を白色にします。
077: // クロス部分を黒色にする 078: r = g = b = 0; 079: color = ( r << 16 ) + ( g << 8 ) + b; 080: for ( y = 0; y < h; ++ y ) { 081: for ( x = 0; x < w; ++ x ) { 082: // 黒の判定 083: if ( ( ( x % ( w_b + w_w ) ) < w_b ) 084: || ( ( y % ( w_b + w_w ) ) < w_b ) ) 085: img.setRGB( x, y, color ); 086: } 087: }
画像の中の全てのピクセルの座標(x,y)を参照するループをつくり、その座標の色が黒か白かを判定していきます。判定した色を(x,y)に代入していきます。 判定は、x座標を(w_b + w_w)ピクセルで割った余りがw_bより小さい場合、またはy座標を(w_b + w_w)ピクセルで割った余りがw_bより小さい場合に黒色にします。下図を参考にしてください。
089: try { 090: // imgをoutname(出力PNG)に保存 091: boolean result; 092: result = ImageIO.write( img, "PNG", new File( outname ) ); 093: } catch ( Exception e ) { 094: // outname(出力PNG)の保存に失敗したときの処理 095: e.printStackTrace(); 096: return; 097: }
BufferedImageクラスのimgのメモリ内のデータを、出力PNG名の変数(outname)に格納されているファイル名で保存します。この場合は、PNGファイル名が不正であったり、保存先のHDDなどが存在していなかったり、空き容量が少ないなどが原因で処理が失敗する可能性があります。
099: // 正常に終了 100: System.out.println( "正常に終了しました" );
全ての処理が正常終了すると、ここまで処理が実行されます。
以上です。
■関連コンテンツ
模様の描画 | いろいろな模様の描画方法を紹介 |
画像ファイル形式 | 画像ファイル形式について解説 |
タイル画像の素材 | フリーの素材を提供 |
■新着情報
2022.07.07 | 外部プログラムの実行 | exeファイル実行 |
2022.07.06 | 完全数 | 6=1+2+3 |
■広告