2022.11.16

画像処理

画像を操作するクラスの作成

JavaのBufferedImageを使って、利便性の高い画像操作クラスを作成しました。

このクラスの特徴は、

①エラー処理を簡単にしました。

画像の作成/読み込み/保存の失敗は、try { ~ } catchを使って処理する必要がありますが、ここで作成したクラスでは、メソッドの中でtry { ~ } catchを使い、成功した場合の戻り値true、失敗した場合の戻り値falseにしています。これで、メソッドを呼ぶ側のソースの記述が短くなります。

②色の指定方法を拡張しました。

指定できる赤/緑/青の輝度は0~255ですが、このクラスの色を設定するメソッド引数の輝度の範囲が0~255の範囲を超える場合、自動的に0~255の範囲に収めるようにしています。計算によって輝度を計算する場合に範囲を超えることがありますが、その計算値をそのままメソッド引数に渡すことができます。

用意したメソッドは以下のとおりです。

以下は、画像の作成/読み込みに関するメソッドです。

MyBufferedImage0.createメソッド

boolean create( int width, int height, int type )
・指定したサイズ、種類の画像を作成します。

  パラメータ width  : 作成する画像の横のピクセル数
        height : 作成する画像の縦のピクセル数
        type   : 作成するイメージの形式
           指定例) BufferedImage.TYPE_INT_RGB

  戻り値    true   : 画像の作成に成功
         false  : 画像の作成に失敗

MyBufferedImage0.readメソッド

boolean create( String imgname )
・指定した画像ファイルを読み込みます。

  パラメータ imgname  : フルパスの画像ファイル名(拡張子は省略不可)

  戻り値    true   : 画像の読み込みに成功
         false  : 画像の読み込みに失敗

以下は、画像の保存に関するメソッドです。

MyBufferedImage0.writeメソッド

boolean write( String imgname, String format )
・画像を指定した形式のファイルで保存します。

  パラメータ imgname  : フルパスの画像ファイル名
      format      : 保存する画像のフォーマットを指定
               ("jpeg"、"png"、"bmp"など)

  戻り値    true   : 画像の読み込みに成功
         false  : 画像の読み込みに失敗

MyBufferedImage0.writeJPGメソッド

boolean writeJPG( String imgname )
・画像をJPEG形式のファイルで保存します。

  パラメータ imgname  : フルパスのJPEG画像ファイル名

  戻り値    true   : 画像の読み込みに成功
         false  : 画像の読み込みに失敗

MyBufferedImage0.writePNGメソッド

boolean writePNG( String imgname )
・画像をPNG形式のファイルで保存します。

  パラメータ imgname  : フルパスのPNG画像ファイル名

  戻り値    true   : 画像の読み込みに成功
         false  : 画像の読み込みに失敗

MyBufferedImage0.writeBMPメソッド

boolean writeBMP( String imgname )
・画像をBMP形式(ビットマップ)のファイルで保存します。


  パラメータ imgname  : フルパスのBMP画像ファイル名

  戻り値    true   : 画像の読み込みに成功
         false  : 画像の読み込みに失敗

以下は、画像の大きさ(ピクセル数)に関するメソッドです。

MyBufferedImage0.getWidthメソッド

public int getWidth()
・画像の横のピクセルサイズを返します。

  パラメータ なし

  戻り値     画像の横ピクセル数

MyBufferedImage0.getHeightメソッド

public int getHeight()
・画像の縦のピクセルサイズを返します。

  パラメータ なし

  戻り値     画像の縦ピクセル数

以下は、画素の色に関するメソッドです。

MyBufferedImage0.getRGBメソッド

int getRGB( int x, int y, int defcolor )
・指定した座標の色を取得します。

  パラメータ x  : ピクセルのx座標
        y  : ピクセルのy座標
        defcolor   : (x,y)が画像の範囲外の場合に戻す値

  戻り値    RGBを合成した色

MyBufferedImage0.setRGBメソッド

boolean setRGB( int x, int y, int color )
・指定した座標の色を設定します。

  パラメータ x  : ピクセルのx座標
        y  : ピクセルのy座標
        color   : 設定するRGBを合成した色

  戻り値    (x,y)が画像の範囲内の場合、true
         (x,y)が画像の範囲外の場合、false
boolean setRGB( int x, int y, int r, int g, int b )
・指定した座標の色を設定します。

  パラメータ x  : ピクセルのx座標
        y  : ピクセルのy座標
        r  : 赤の輝度
        g  : 緑の輝度
        b  : 青の輝度

  戻り値    (x,y)が画像の範囲内の場合、true
         (x,y)が画像の範囲外の場合、false

  詳細         r、g、bは自動で0~255の範囲に変換されます。

MyBufferedImage0.createColorメソッド

static int createColor( int r, int g, int b )
・RGBを合成した色を取得します。

  パラメータ r  : 赤の輝度
        g  : 緑の輝度
        b  : 青の輝度

  戻り値    RGBを合成した色

  詳細         r、g、bを自動で0~255の範囲に変換した後に合成します。

MyBufferedImage0.getRメソッド

static int getR( int color )
・RGBを合成した色からR成分(赤の輝度)だけを抽出します。

  パラメータ color  : RGBを合成した色

  戻り値    赤の輝度

MyBufferedImage0.getGメソッド

static int getG( int color )
・RGBを合成した色からG成分(緑の輝度)だけを抽出します。

  パラメータ color  : RGBを合成した色

  戻り値    緑の輝度

MyBufferedImage0.getBメソッド

static int getB( int color )
・RGBを合成した色からB成分(青の輝度)だけを抽出します。

  パラメータ color  : RGBを合成した色

  戻り値    青の輝度

以下は、検査に関するメソッドです。

MyBufferedImage0.isoutofrangeメソッド

boolean isOutofRange( int x, int y )
・指定した座標が画像の範囲外かを判定します。

  パラメータ x  : ピクセルのx座標
        y  : ピクセルのy座標

  戻り値    (x,y)が画像の範囲外の場合、true
         (x,y)が画像の範囲内の場合、false

Javaソースコード

MyBufferedImage0.java

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import java.io.IOException;

public class MyBufferedImage0 {
	// 画像
	BufferedImage img = null;

	// コンストラクタ
	public MyBufferedImage0()
	{
		img = null;
	}


	// 画像の横サイズを取得
	public int getWidth()
	{
		// 画像がなければ、0を戻す
		if ( null == img ) return 0;

		return img.getWidth();
	}


	// 画像の縦サイズを取得
	public int getHeight()
	{
		// 画像がなければ、0を戻す
		if ( null == img ) return 0;

		return img.getHeight();
	}


	// 画像の作成
	public boolean create( int width, int height, int type )
	{
		// BufferImageのimgにnullを代入
		img = null;

		// 画像の作成
		try {
			img = new BufferedImage( width, height, type );
		} catch ( Exception e ) {
			// 画像作成に失敗
			return false;
		}

		// ここまでくれば、作成に成功
		return true;
	}
	


	// 画像の読み込み
	public boolean read( String imgname )
	{
		// BufferImageのimgにnullを代入
		img = null;

		// 画像の読み込み
		try {
			// imgnameを読み込んでimgにセット
			img = ImageIO.read( new File( imgname ) );
		} catch (Exception e) {
			// imgnameの読み込みに失敗
			return false;
		}

		// ここまでくれば、読み込み成功
		return true;
	}


	// 画像の保存
	public boolean write( String imgname, String format )
	{
		// 画像がない場合
		if ( null == img ) return false;

		// 画像の保存
		try {
			// imgnameに保存
			if ( false == ImageIO.write( img, format, new File( imgname ) ) )
				return false;
		} catch ( Exception e ) {
			// imgnameの保存に失敗
			return false;
		}

		// ここまでくれば、保存に成功
		return true;
	}


	// JPEG画像の保存
	public boolean writeJPG( String imgname )
	{
		return write( imgname, "jpeg" );
	}


	// PNG画像の保存
	public boolean writePNG( String imgname )
	{
		return write( imgname, "png" );
	}


	// BMP画像の保存
	public boolean writeBMP( String imgname )
	{
		return write( imgname, "bmp" );
	}

	
	// (x,y)が画像の外かを調べる
	public boolean isOutofRange( int x, int y )
	{
		// 画像がない場合、画像の外
		if ( null == img ) return true;

		// 座標の値がマイナスの場合、画像の外
		if ( 0 > x ) return true;
		if ( 0 > y ) return true;

		// 座標の値が画像幅以上の場合、画像の外
		if ( img.getWidth() <= x ) return true;
		if ( img.getHeight() <= y ) return true;

		// (x,y)は画像の内側
		return false;
	}


	// (x,y)の色を取得
	public int getRGB( int x, int y, int defcolor )
	{
		// 画像がない場合、defcolorを戻す
		if ( null == img ) return defcolor;

		// 画像の範囲外の場合、defcolorを戻す
		if ( isOutofRange( x, y ) ) return defcolor;

		// 画像の色を戻す
		return img.getRGB( x, y );
	}


	// (x,y)の色を設定、色はrgbを合成したintで指定
	public boolean setRGB( int x, int y, int color )
	{
		// 画像がない場合、defcolorを戻す
		if ( null == img ) return false;

		// 画像の範囲外の場合、falseを戻す
		if ( isOutofRange( x, y ) ) return false;

		// 画像の色を戻す
		img.setRGB( x, y, color );

		return true;
	}


	// (x,y)の色を設定、色はrgbをそれぞれintで指定
	public boolean setRGB( int x, int y, int r, int g, int b )
	{
		int color;

		// rgbを合成
		color = createColor( r, g, b );

		// 合成した色colorを設定
		return setRGB( x, y, color );
	}


	// 色rgbを合成
	public static int createColor( int r, int g, int b )
	{
		// rgbを0~255の範囲に収める
		if ( 0 > r ) r = 0;
		if ( 0 > g ) g = 0;
		if ( 0 > b ) b = 0;
		if ( 255 < r ) r = 255;
		if ( 255 < g ) g = 255;
		if ( 255 < b ) b = 255;

		// rgbを合成して戻す
		return ( r << 16 ) | ( g << 8 ) | b;
	}


	// 合成した色からrの値を取得
	public static int getR( int color )
	{
		return ( color >> 16 ) & 0xff;
	}


	// 合成した色からgの値を取得
	public static int getG( int color )
	{
		return ( color >> 8 ) & 0xff;
	}


	// 合成した色からbの値を取得
	public static int getB( int color )
	{
		return color & 0xff;
	}
}

このクラスを利用したプログラム

このサイトのオリジナルクラスのMyBufferedImage0クラスを利用して、JPEG、BMP、TIFFなどの各種画像ファイルをPNG形式のファイルに保存するプログラムを紹介しています。

2022.11.18

このサイトのオリジナルクラスのMyBufferedImage0クラスを利用して、JPEG、PNG、BMP、TIFFなどの各種画像の横と縦のピクセル数を求めるプログラムを紹介しています。

2022.11.19

広告