ともさんのHP >プロブラミング >自作JavaLibrary >BMP形式で画像ファイルを作成するクラス
BMP形式で画像ファイルを作成するクラス
tomojavalib.gazou.BmpはBufferdImageをBMPファイル形式にして保存するJavaクラスです。
Java
楽天 標準でJpgやPng形式のファイルが出来ますが、Bmp形式はないので自分で作ってみました。
公開されているBmpファイルの書式を元に作りましたが、JavaなのにC言語みたいな文章になってしまいました。
こういうのはJavaに向いていないのでしょう。
クラスの実行例
下記を実行するとサイズ100×100の真っ黒なビットマップ形式の画像ファイルが出来ます。
Bmp bmp = new Bmp();
java.awt.image.BufferedImage img = new java.awt.image.BufferedImage(100, 100,BufferedImage.TYPE_INT_RGB);
bmp.loadBufferedImage( img );
bmp.saveBmp( "c:\\work\\test.bmp" );
自作JAVAクラスライブラリのソース
package tomojavalib.gazou;
import java.io.*;
import java.awt.image.*;
/**
* BufferdImageをBMPファイル形式にして保存するクラス
* @author to.totomo.net
*
*/
public class Bmp {
//ビットマップファイルヘッダ変数
/**ファイル識別文字"B"を格納する変数(1byte)*/
public char hb;
/**ファイル識別文字"M"を格納する変数(1byte)*/
public char hm;
/**file sizeを格納する変数(LH4byte)*/
public long file_size;
/**予約領域を格納する変数(LH4byte)0を入れておく*/
public long yoyaku;
/**header sizeを格納する変数(LH4byte):54をいれる*/
public long header_size;
//ビットマップ情報ヘッダ変数
/**情報 sizeを格納する変数(LH4byte):40を入れる*/
public long jouhou_size;
/**画像x sizeを格納する変数(LH4byte)*/
public int x_size;
/**画像y sizeを格納する変数(LH4byte)*/
public int y_size;
/**面数を格納する変数(LH2byte):1を入れる*/
public int men;
/**色bit数を格納する変数(LH2byte):1/4/8/24のいずれかを入れる*/
public long iro_bit;
/**圧縮方式を格納する変数(LH4byte):0*/
public long asyuku;
/**圧縮サイズを格納する変数(LH4byte):0*/
public long asyuku_size;
/**水平解像度を格納する変数(LH4byte):0*/
public long suihei_kaizou;
/**垂直解像度を格納する変数(LH4byte):0*/
public long suityoku_kaizou;
/**色数を格納する変数(LH4byte):0*/
public long iro_suu;
/**重要色数を格納する変数(LH4byte):0*/
public long juuyou_irosuu;
/**data格納する変数 :1/4/8/24bit*/
public int bmp_data[][];
/**ファイル名を格納する文字列*/
//public String file_name;
/**data最大値を格納する変数 :1/4/8/24bit*/
public int bmp_data_max;
/**data最小値を格納する変数 :1/4/8/24bit*/
public int bmp_data_min;
/**
* アプリケーション:main()
* 引数:なし
* 機能:このclassの動作試験
*/
public static void main( String argv[] ) {
Bmp bmp = new Bmp();
java.awt.image.BufferedImage img = new java.awt.image.BufferedImage(100, 100,BufferedImage.TYPE_INT_RGB);
bmp.loadBufferedImage( img );
bmp.saveBmp( "z:\\work\\test.bmp" );
}
/**
* コンストラクタ:Bmp()
* 引数:なし
* 機能:ヘッダファイルの一般的な値を入れる
*/
public Bmp()
{
hb = 'B';
hm = 'M';
yoyaku = 0;
header_size = 54;
jouhou_size = 40;
x_size = 264;
y_size = 242;
men = 1;
iro_bit = 24;
asyuku = 0;
asyuku_size = 0;
suihei_kaizou = 0;
suityoku_kaizou= 0;
iro_suu = 0;
juuyou_irosuu = 0;
file_size = (header_size + (x_size * y_size) * (iro_bit / 8));
bmp_data_max = 0x0;
}
/**
* メソッド:loadBufferedImage( BufferedImage bimg )
* 引数:
* 機能:BmpオブジェクトをBufferdImageから作る。
*/
public void loadBufferedImage( BufferedImage bimg )
{
y_size = bimg.getHeight();
x_size = bimg.getWidth();
//x_size = 500;
iro_bit = 24;
file_size = (header_size + ( x_size * y_size ) * (long)(iro_bit / 8.));
bmp_data = new int[ x_size ][ y_size ];
for(int x=0; x < x_size; x++){
for(int y=0; y < y_size ; y++){
bmp_data[x][y] = bimg.getRGB( x , y );
}}
}
/**
* メソッド:saveBmp( String file_name )
* 引数:
* 機能:Bmpオブジェクトを指定のファイル名のbmp形式で保存する。
*/
public void saveBmp( String file_name )
{
long iii;
int tmp;
FileOutputStream fos;
try {
fos = new FileOutputStream( file_name );
//ヘッダの出力
fos.write( (byte) hb ); // 'B'出力
fos.write( (byte) hm ); // 'M'出力
//ファイルサイズ出力
fos.write( (byte) (file_size));
fos.write( (byte) (file_size / 0x100));
fos.write( (byte) (file_size / 0x10000));
fos.write( (byte) (file_size / 0x1000000));
//予約領域を出力
fos.write( (byte) (yoyaku));
fos.write( (byte) (yoyaku / 0x100));
fos.write( (byte) (yoyaku / 0x10000));
fos.write( (byte) (yoyaku / 0x1000000));
//ヘッダーサイズを出力
fos.write( (byte) ( header_size));
fos.write( (byte) ( header_size / 0x100));
fos.write( (byte) ( header_size / 0x10000));
fos.write( (byte) ( header_size / 0x1000000));
//情報サイズを出力
fos.write( (byte) ( jouhou_size));
fos.write( (byte) ( jouhou_size / 0x100));
fos.write( (byte) ( jouhou_size / 0x10000));
fos.write( (byte) ( jouhou_size / 0x1000000));
//画像xサイズを出力
fos.write( (byte) ( x_size));
fos.write( (byte) ( x_size / 0x100));
fos.write( (byte) ( x_size / 0x10000));
fos.write( (byte) ( x_size / 0x1000000));
//画像yサイズを出力
fos.write( (byte) ( y_size));
fos.write( (byte) ( y_size / 0x100));
fos.write( (byte) ( y_size / 0x10000));
fos.write( (byte) ( y_size / 0x1000000));
//面数を出力
fos.write( (byte) ( men));
fos.write( (byte) ( men / 0x100));
//色ビット数を出力
fos.write( (byte) ( iro_bit));
fos.write( (byte) ( iro_bit / 0x100));
//圧縮方式を出力
fos.write( (byte) ( asyuku));
fos.write( (byte) ( asyuku / 0x100));
fos.write( (byte) ( asyuku / 0x10000));
fos.write( (byte) ( asyuku / 0x1000000));
//圧縮サイズを出力
fos.write( (byte) ( asyuku_size));
fos.write( (byte) ( asyuku_size / 0x100));
fos.write( (byte) ( asyuku_size / 0x10000));
fos.write( (byte) ( asyuku_size / 0x1000000));
//水平解像度を出力
fos.write( (byte) ( suihei_kaizou));
fos.write( (byte) ( suihei_kaizou / 0x100));
fos.write( (byte) ( suihei_kaizou / 0x10000));
fos.write( (byte) ( suihei_kaizou / 0x1000000));
//垂直解像度を出力
fos.write( (byte) ( suityoku_kaizou));
fos.write( (byte) ( suityoku_kaizou / 0x100));
fos.write( (byte) ( suityoku_kaizou / 0x10000));
fos.write( (byte) ( suityoku_kaizou / 0x1000000));
//色数を出力
fos.write( (byte) ( iro_suu));
fos.write( (byte) ( iro_suu / 0x100));
fos.write( (byte) ( iro_suu / 0x10000));
fos.write( (byte) ( iro_suu / 0x1000000));
//重要色数を出力
fos.write( (byte) ( juuyou_irosuu));
fos.write( (byte) ( juuyou_irosuu / 0x100));
fos.write( (byte) ( juuyou_irosuu / 0x10000));
fos.write( (byte) ( juuyou_irosuu / 0x1000000));
//dataの出力
int ama = x_size - (int)(x_size / 4.) * 4 ;
for(int y=y_size-1 ; y >-1 ; y--){
for(int x=0; x < x_size; x++){
tmp = bmp_data[ x ][ y ];
fos.write( (byte) ( ( 0x0000ff & tmp ) / 0x1 ));
fos.write( (byte) ( ( 0x00ff00 & tmp ) / 0x100 ));
fos.write( (byte) ( ( 0xff0000 & tmp ) / 0x10000 ));
}
// System.out.println("余り = " + Integer.toString( ama ) );
for( int I = 0; i
fos.close(); // 書き出しのストリームのクローズ
}catch( Exception e ) { // 例外が発生
System.err.println("Error….1");
System.exit(-1);
}
}
}
最終更新日: 2012-05-09 07:03:05
ともさんのHP >プロブラミング >自作JavaLibrary >BMP形式で画像ファイルを作成するクラス
ツイート