2020/03/23 公開
・画像の新規作成 その2
フルカラー(24bit)の画像を新しく作成する方法を解説します。
ここで解説するのは、横方向と縦方向のピクセル数と背景色(RGB)を指定してPNG形式の画像ファイルを作成するものです。
新しく作成した画像は、グラフィックの描画や、画像処理の結果の保存や、画像処理の途中経過を保存する等に利用できます。
以下がそのソースコード例です。
CreateImage2.java ← クリックしてダウンロードページに移動001: import java.awt.image.BufferedImage; 002: import java.awt.Graphics2D; 003: import java.awt.Color; 004: import java.io.File; 005: import javax.imageio.ImageIO; 006: import java.io.IOException; 007: 008: public class CreateImage2 { 009: public static void main( String[] args ) { 010: // 結果格納フラグ 011: boolean result; 012: // 画像サイズ 013: int width, height; 014: // 背景色 015: int back_r, back_g, back_b; 016: // ファイル名 017: String outname; 018: // 画像格納クラス 019: BufferedImage img = null; 020: 021: // 入力した引数が6つ以上かを調べる 022: if ( 6 > args.length ) { 023: // 入力した引数が6つ未満の場合、使用方法を表示する 024: System.out.println( "CreateImage2 [PNG名][幅][高さ][R][G][B]" ); 025: return; 026: } 027: 028: // 出力PNG名をoutnameに代入(拡張子".png"省略なし) 029: outname = args[ 0 ]; 030: 031: try { 032: // 幅ピクセルをwidthに代入 033: width = Integer.parseInt( args[ 1 ] ); 034: // 高さピクセルをheightに代入 035: height = Integer.parseInt( args[ 2 ] ); 036: // 赤の輝度(R)をback_rに代入 037: back_r = Integer.parseInt( args[ 3 ] ); 038: // 緑の輝度(G)をback_gに代入 039: back_g = Integer.parseInt( args[ 4 ] ); 040: // 青の輝度(B)をback_bに代入 041: back_b = Integer.parseInt( args[ 5 ] ); 042: } catch ( NumberFormatException e ) { 043: // 引数をwidth、heightの変換に失敗したときの処理 044: e.printStackTrace(); 045: return; 046: } 047: 048: // 画像サイズの検査 049: if ( ( 1 > width ) || ( 1 > height ) ) { 050: // 画像のサイズに1より小さい値が指定されたとき処理 051: System.out.println( "画像サイズが範囲外です" ); 052: return; 053: } 054: 055: // RGBの検査(0~255の範囲内か) 056: if ( ( 0 > back_r ) || ( 255 < back_r ) ) { 057: System.out.println( "背景色Rの値が範囲外です" ); 058: return; 059: } 060: if ( ( 0 > back_g ) || ( 255 < back_g ) ) { 061: System.out.println( "背景色Gの値が範囲外です" ); 062: return; 063: } 064: if ( ( 0 > back_b ) || ( 255 < back_b ) ) { 065: System.out.println( "背景色Bの値が範囲外です" ); 066: return; 067: } 068: 069: // 24ビットカラーの画像を作成 070: try { 071: img = new BufferedImage( width, height, 072: BufferedImage.TYPE_INT_RGB ); 073: } catch ( Exception e ) { 074: // 画像作成に失敗したときの処理 075: e.printStackTrace(); 076: return; 077: } 078: 079: // 背景色で画像全体を塗り潰し 080: Graphics2D g = (Graphics2D)img.getGraphics(); 081: g.setColor( new Color( back_r, back_g, back_b ) ); 082: g.fillRect( 0, 0, width, height ); 083: 084: // 24ビットカラーの画像を作成 085: try { 086: // imgをoutname(出力PNG)に保存 087: result = ImageIO.write( img, "png", new File( outname ) ); 088: } catch ( Exception e ) { 089: // outname(出力PNG)の保存に失敗したときの処理 090: e.printStackTrace(); 091: return; 092: } 093: 094: // 正常に終了 095: System.out.println( "正常に終了しました" ); 096: } 097: }
CreateImage2を実行
C:\talavax\javasample>java CreateImage2 createimage2.png 256 128 255 0 0
1つ目の引数で渡したPNGファイルを新しく作成します。その画像のサイズは、2つ目の引数で指定した幅ピクセル、3つ目の引数で指定した高さピクセルで作成されます。4つ目~6つ目の引数で背景色のRGBの値を指定しています。
実行結果
・作成した画像(createimage2.png)
新しく、赤色(R=255,G=0,B=0)のPNG画像が作成されました。
ここからは、このソースコードを上から順番に解説していきます。
001: import java.awt.image.BufferedImage; 002: import java.awt.Graphics2D; 003: import java.awt.Color; 004: import java.io.File; 005: import javax.imageio.ImageIO; 006: import java.io.IOException;
Javaのクラスライブラリの中から「java.awt.image.BufferedImage」と「 import java.awt.Graphics2D」と「import java.awt.Color」と「java.io.File」と「javax.imageio.ImageIO」と「java.io.IOException」というパッケージにあるクラスを、このプログラム内で使うために記述します。
008: public class CreateImage2 {
クラス名を、CreateImage2としています。
009: public static void main( String[] args ) {
このmainメソッドからプログラムを実行します。
010: // 結果格納フラグ 011: boolean result; 012: // 画像サイズ 013: int width, height; 014: // 背景色 015: int back_r, back_g, back_b; 016: // ファイル名 017: String outname; 018: // 画像格納クラス 019: BufferedImage img = null;
このプログラムで使う変数を宣言しています。
021: // 入力した引数が6つ以上かを調べる 022: if ( 6 > args.length ) { 023: // 入力した引数が6つ未満の場合、使用方法を表示する 024: System.out.println( "CreateImage2 [PNG名][幅][高さ][R][G][B]" ); 025: return; 026: }
6つ以上の引数が与えられたかをチェックし、6つ未満の場合に、使い方のメッセージを表示し、return文によってmainメソッドを抜けています。
028: // 出力PNG名をoutnameに代入(拡張子".png"省略なし) 029: outname = args[ 0 ];
与えられた1つ目の引数を、出力PNG名の変数(outname)代入しています。
032: // 幅ピクセルをwidthに代入 033: width = Integer.parseInt( args[ 1 ] ); 034: // 高さピクセルをheightに代入 035: height = Integer.parseInt( args[ 2 ] );
与えられた2つ目と3つ目の引数を、それぞれ、幅ピクセルwidth、高さピクセルheightに代入しています。
036: // 赤の輝度(R)をback_rに代入 037: back_r = Integer.parseInt( args[ 3 ] ); 038: // 緑の輝度(G)をback_gに代入 039: back_g = Integer.parseInt( args[ 4 ] ); 040: // 青の輝度(B)をback_bに代入 041: back_b = Integer.parseInt( args[ 5 ] );
与えられた4つ目~6つ目の値をそれぞれ、背景色を格納する変数back_r/back_g/back_bに代入しています。
048: // 画像サイズの検査 049: if ( ( 1 > width ) || ( 1 > height ) ) { 050: // 画像のサイズに1より小さい値が指定されたとき処理 051: System.out.println( "画像サイズが範囲外です" ); 052: return; 053: }
画像サイズwidth、heightのいずれかが1未満の場合には、エラーメッセージを出力し、return文でmainメソッドを抜けています。
055: // RGBの検査(0~255の範囲内か) 056: if ( ( 0 > back_r ) || ( 255 < back_r ) ) { 057: System.out.println( "背景色Rの値が範囲外です" ); 058: return; 059: } 060: if ( ( 0 > back_g ) || ( 255 < back_g ) ) { 061: System.out.println( "背景色Gの値が範囲外です" ); 062: return; 063: } 064: if ( ( 0 > back_b ) || ( 255 < back_b ) ) { 065: System.out.println( "背景色Bの値が範囲外です" ); 066: return; 067: }
RGBの値が0~255の範囲の外だった場合には、エラーメッセージを出力し、return文でmainメソッドを抜けています。
069: // 24ビットカラーの画像を作成 070: try { 071: img = new BufferedImage( width, height, 072: BufferedImage.TYPE_INT_RGB ); 073: } catch ( Exception e ) { 074: // 画像作成に失敗したときの処理 075: e.printStackTrace(); 076: return; 077: }
BufferedImageクラスのコンストラクタで、新しいBufferedImageを構築しています。
BufferedImageコンストラクタ
■新しい BufferedImage を構築します。 パラメータ width : 構築する画像の横ピクセル height : 構築する画像の縦ピクセル imageType : 構築する画像のイメージ形式
imgTypeで指定しているTYPE_INT_RGBは、整数型ピクセルにパックされた 8 ビット RGB 色成分によるイメージを表します。これを指定することで24ビットの画像を作成できます。
try { ~ } catchは、失敗する可能性がある処理を波括弧で囲み、その処理に失敗したときにcatch { ~ }の波括弧で囲まれた処理を実行するということです。この場合は、PNGファイル名が不正であったり、存在していなかったり、フォーマットが違っているなどが原因で処理が失敗する可能性があります。処理が失敗するとreturnによってmainメソッドを抜けるようにしています。
079: // 背景色で画像全体を塗り潰し 080: Graphics2D g = (Graphics2D)img.getGraphics(); 081: g.setColor( new Color( back_r, back_g, back_b ) ); 082: g.fillRect( 0, 0, width, height );
img.getGraphics()でグラフックスコンテキストを取得し、指定した背景色で塗り潰し矩形を画像全体に描画しています。
変数back_r、back_g、back_bで作成したColorをGraphics.setColorに渡して、それをGraphics.fillRectメソッドを呼んで矩形を表示しています。
g.fillRect( 0, 0, width, height );は、左上の座標が(0,0)で幅がwidth、高さがheightの矩形を描画することなので、結果として画像全体が矩形で塗り潰されることになります。メソッドの引数は以下を参考にしてください。
Colorコンストラクタ
■赤緑青の値を使って、不透明なsRGBカラーを生成します。 パラメータ r : 赤の値(0-255) g : 緑の値(0-255) b : 青の値(0-255)
■赤緑青とアルファの値を使って、sRGBカラーを生成します。 パラメータ r : 赤の値(0-255) g : 緑の値(0-255) b : 青の値(0-255) a : アルファ値(0-255)
Graphics.setColorメソッド
■このグラフィックスコンテキストの現在の色を、指定された色に設定します。 パラメータ c : 色 戻り値 なし
Graphics.fillRectメソッド
■指定された矩形(長方形)を塗りつぶします。 パラメータ x : 描画する矩形の左上隅のx座標 y : 描画する矩形の左上隅のy座標 width : 描画する矩形の幅 height : 描画する矩形の高さ 戻り値 なし
084: // 24ビットカラーの画像を作成 085: try { 086: // imgをoutname(出力PNG)に保存 087: result = ImageIO.write( img, "png", new File( outname ) ); 088: } catch ( Exception e ) { 089: // outname(出力PNG)の保存に失敗したときの処理 090: e.printStackTrace(); 091: return; 092: }
BufferedImageクラスのimgのメモリ内のデータを、出力PNG名の変数(outname)に格納されているファイル名で保存します。この場合は、PNGファイル名が不正であったり、保存先のHDDなどが存在していなかったり、空き容量が少ないなどが原因で処理が失敗する可能性があります。
ImageIO.wrireメソッド
■BufferedImageを画像ファイルに保存します。 パラメータ RenderedImage : 保存するRenderedImage formatName : 画像ファイルのフォーマット(png/jpeg/bmp/gifなど) output : Fileオブジェクト 戻り値 保存に成功するとtrue、失敗するとfalseを返します。
094: // 正常に終了 095: System.out.println( "正常に終了しました" );
全ての処理が正常終了すると、ここまで処理が実行されます。
以上です。
■関連コンテンツ
画像の新規作成 | 画像を新しく作成する方法について解説 |
画像の色 | 画像の色について解説 |
画像ファイル形式 | 画像ファイル形式について解説 |
値のコンソール表示 | print()、println()とは? |
return文 | メソッドの戻り値 |
Javaの変数 | Javaで扱う変数について解説 |
■新着情報
2022.07.07 | 外部プログラムの実行 | exeファイル実行 |
2022.07.06 | 完全数 | 6=1+2+3 |
■広告