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 |
■広告
