ともさんの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形式で画像ファイルを作成するクラス

広告
新着ページ

AIを利用し、衣服のデザイン画から型紙を制作する方法  
2つのアパレル3D技術でひらくオーダーメイド生産の手法  
【洋裁型紙】前後身頃の肩の傾きは何故前身頃の方が傾いているのか  
電子追尾式天体写真撮影法  
日本ミツバチ巣箱の種類  
ドラフター(製図台)でソーイング  
日本ミツバチが逃亡  
カメさんの箱庭  
天体用デジタルカメラの構造と天体写真  
Javaで静止画像(Jpeg)を動画(Mov)に変換  
USBカメラをJAVAで制御  

他のサイト

3D-CAD
洋裁CAD

いいねなど

 RSS 

Author: Tomoyuki Ito

このサイトの文章・写真の無断転載を禁じます