BMP画像ファイルの構造について

このQ&Aのポイント
  • BMP画像ファイルの構造とは、ヘッダ情報と画像データから成り立っています。
  • JavaでBMPファイルを読み出し、read()を使って画像データを読み取りました。
  • 画像データのバイト数は48バイトであり、16バイトではない理由について解説してください。
回答を見る
  • ベストアンサー

BMP画像ファイルの構造について

JavaでBMPファイルを読み出し、read()を使い1バイトごと読み出しました。使用した画像の大きさは,4x4のカラーデータです。 実行結果は、 66 77 102 0 0 0 0 0 0 0 54 0 0 0 40 0 0 0 4 0 0 0 4 0 0 0 1 0 24 0 0 0 0 0 48 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 65533 65533 65533 65533 65533 65533 65533 65533 65533 65533 65533 65533 65533 65533 65533 65533 65533 65533 65533 65533 65533 65533 65533 65533 65533 65533 65533 65533 65533 65533 65533 65533 65533 65533 65533 65533 65533 65533 65533 65533 65533 65533 65533 65533 65533 65533 65533 65533 という結果が得られ、最初の54バイトがヘッダ情報で、残りが画像データというのは、分かるのですが、解析結果から、画像データのバイト数が48バイト(上記、65533の個数)であります。しかし、画像データ(BMPファイル)のもともとの大きさが4x4ということから結果として得られるバイト数は16バイトになると思うのですが、なぜ画像データの大きさが16バイトではなく48バイトなのでしょうか? 画像に詳しい方教えてください。できれば、参考サイトもあれば参考サイトも紹介していただきたい。

質問者が選んだベストアンサー

  • ベストアンサー
noname#43437
noname#43437
回答No.1

biBitCount=24 すなわち、1ピクセル24ビット(3バイト)なので、 横走査線バイト数=横4ピクセル×3 = 12バイト 横走査線バイト数×縦4ピクセル = 48バイト ちなみに、横走査線バイト数は4の倍数に切り上げられるので、 たとえば横5ピクセルの場合、横走査線は16バイトとなり、 各走査線の最後の1バイトは無視(基本的に0)となります。

marucha
質問者

お礼

そういうことだったのですか。 理解しました。ありがとうございました。

関連するQ&A

  • bmp画像ファイルから最も多く使われている色

    bmp画像ファイルから最も多く使われている色を選ぶ方法を探しています。 比較的色の数が少ないbmp形式の画像ファイルから最も多く使われている色を選びたいのですが なにかいい方法やフリーのソフトなどを知っていたら教えていただきたいです。

  • bmpファイルが開きません。

    ウェブサイトからの画像などは(ビットマップ)Adobeで 開くのですが、友人からHotmailへ送ってもらった ビットマップ イメージ画像が開きません。 ‐‐‐ ファイル形式用プラグインはファイルを 解析することができません。 従って、「◯◯◯◯.bmp」を 開く事ができませんでした。 ‐‐‐‐ このように表示されます。 宜しくお願いします。(;^_^A

  • BMPファイルへの書き込みができない

    このプログラムは、左半分を黒、右半分を白の画像をBMPファイルに出力しようとしています。(出来ていません) プログラムの下に質問書いてます!お願いします! #include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct{ char *filename; int x; int y; int width; int height; unsigned char data[80][100]; } BMP_DATA; static void WriteBmp(char *filename, BMP_DATA Image) { unsigned long Bmp_size;/*BMPファイルのサイズ*/ unsigned int Bmp_info_header_size;/*情報ヘッダのサイズ*/ unsigned int Bmp_header_size;/*ヘッダのサイズ*/ long Bmp_width;/*幅*/ long Bmp_height;/*高さ*/ unsigned short Bmp_planes;/*プレーン数*/ unsigned short Bmp_color;/*色 = 1[bit] (黒か白かだけ)*/ long Bmp_image_size;/*画像部分のサイズ*/ long Bmp_xppm;/*水平解像度*/ long Bmp_yppm;/*垂直解像度*/ int i,j; unsigned char Bmp_headbuf[54]; /*ヘッダ*/ unsigned char Bmp_Data[13]; FILE *Out = fopen(filename, "wb"); if(Out==NULL){ fclose(Out); exit(1); } /* ヘッダ情報の準備 */ Bmp_info_header_size = 40; Bmp_header_size = 54; Bmp_planes = 1; Bmp_color = 1; Bmp_image_size = Image.height * Image.width; Bmp_xppm = 0; Bmp_yppm = 0; Bmp_size = Bmp_image_size + Bmp_header_size; Bmp_headbuf[0] = 'B'; Bmp_headbuf[1] = 'M'; memcpy(Bmp_headbuf+2, &Bmp_size, sizeof(Bmp_size)); Bmp_headbuf[6] = 0; Bmp_headbuf[7] = 0; Bmp_headbuf[8] = 0; Bmp_headbuf[9] = 0; memcpy(Bmp_headbuf+10, &Bmp_header_size, sizeof(Bmp_header_size)); Bmp_headbuf[11] = 0; Bmp_headbuf[12] = 0; Bmp_headbuf[13] = 0; memcpy(Bmp_headbuf+14, &Bmp_info_header_size, sizeof(Bmp_info_header_size)); Bmp_headbuf[15] = 0; Bmp_headbuf[16] = 0; Bmp_headbuf[17] = 0; memcpy(Bmp_headbuf+18, &Image.width, sizeof(Bmp_width)); memcpy(Bmp_headbuf+22, &Image.height, sizeof(Bmp_height)); memcpy(Bmp_headbuf+26, &Bmp_planes, sizeof(Bmp_planes)); memcpy(Bmp_headbuf+28, &Bmp_color, sizeof(Bmp_color)); memcpy(Bmp_headbuf+34, &Bmp_image_size, sizeof(Bmp_image_size)); memcpy(Bmp_headbuf+38, &Bmp_xppm, sizeof(Bmp_xppm)); memcpy(Bmp_headbuf+42, &Bmp_yppm, sizeof(Bmp_yppm)); Bmp_headbuf[46] = 0; Bmp_headbuf[47] = 0; Bmp_headbuf[48] = 0; Bmp_headbuf[49] = 0; Bmp_headbuf[50] = 0; Bmp_headbuf[51] = 0; Bmp_headbuf[52] = 0; Bmp_headbuf[53] = 0; /* ヘッダ情報書き出し */ fwrite(Bmp_headbuf, sizeof(unsigned char), Bmp_header_size, Out); /* 画像データ書き出し */ for(i=0;i<13;i++) Bmp_Data[i] = 0; for(i=0; i<Image.height; i++){ for(j=0; j<Image.width; j++){ int index = j/8; if(j%8 == 0){ Bmp_Data[index] = Image.data[i][j ] * 128 + Image.data[i][j+1] * 64 + Image.data[i][j+2] * 32 + Image.data[i][j+3] * 16 + Image.data[i][j+4] * 8 + Image.data[i][j+5] * 4 + Image.data[i][j+6] * 2 + Image.data[i][j+7]; } } Bmp_Data[12] = (Bmp_Data[12] & 0xf0); fwrite(Bmp_Data, sizeof(unsigned char), 20, Out); /* ○ */ } fclose(Out); } int main() { BMP_DATA Image; int line = 0; int i,j; Image.x = 0; Image.y = 0; Image.width = 100; Image.height = 80; if(line == 0){ for(i=0; i<Image.height; i++){ for(j=0; j<Image.width; j++){ Image.data[i][j] = 1; } } } while(1){ /* BMPファイルデータを編集 */ for(j=0; j<Image.width; j++){ if(j < 50){ Image.data[line][j] = 0;//black }else{ Image.data[line][j] = 1;//white } } /* すべての列を編集したら、再描画する */ if(line == 63){ /* BMPファイルに書込む */ WriteBmp("display.bmp", Image); break; } line++; } return 0; } 以下の条件で、BMPファイルへ書き込もうとしています ・色の深さ1(黒か白) ・画像のピクセルサイズ(横100×縦80) fwrite関数で1列ずつ書き込もうとしているのですが、 この関数は1バイトずつしか書き込めないみたいで、100ビット書き込もうと思うと、 最低でも104ビット書き込まなくてはならない状況になります。 まず、この4ビットはどう処理すればいいのでしょうか?? あと、display.bmpのファイルがある状態で、プログラムを実行するとちゃんと動くのですが、 プログラム中の○のところのfwrite関数の第三引数を13にすると、BMPファイルが壊れて閲覧できなくなります。(ある程度大きい数字だと、BMPファイルは壊れないのですが、ぐちゃぐちゃの絵になります) その理由もわかりません。 汚い文章&プログラムですが よろしくお願いします><

  • BMP画像の画像データ本体をテキストデータとして保存したい

    BMP画像を読み込んで、ヘッダ箇所などの本体と関係ない部分を読み飛ばして、画像本体をテキストファイルとして保存するプログラムを作ったのですが、実際の画像の大きさ(512x480)と出力結果(質問箇所最下に記載)の画像の大きさが異なってしまいます。あまり画像に詳しくないので、どこが間違っているのか分かりません。どこを修正すべきか教えてください。以下が作成したプログラムです。 public class bmpTotxt {  public static void main(String[] args){   try {    FileReader fr = new FileReader("./1.bmp");    BufferedReader br = new BufferedReader(fr);    FileWriter fw = new FileWriter("./pic.txt");    int i,count=0,len=0,width=512*4,height=0;    while((i = br.read()) != -1){     /* 画像本体箇所なら */     if(len >= 54){      fw.write(i+" ");      len++;      count++;            if(count == width){        fw.write("\n");        height++;        count = 0;      }     }     else{       len++;     }    }    System.out.println("ヘッダ長:"+54);    System.out.println("画像データ長:"+(len-54));    System.out.println("width:"+width/4);    System.out.println("height:"+height);    fr.close();    fw.close();   }   catch (Exception e) {    e.printStackTrace();   }  } } /* 出力結果   ヘッダ長:54   画像データ長:648480   width:512   height:316 */

    • ベストアンサー
    • Java
  • BMP画像の取り扱い

    (1)BMP形式の画像を読み込み (2)RGB値を取得 (3)画素値を操作 (4)新しいファイルに書き出す というプログラムを作りたいのですが、BMP画像からRGB値がうまく取り出せません。 参考URLなどありましたらぜひ教えてください。

  • フォトショップでBMPファイルが開けない

    現在Phtoshop6.0を使っています。(WindowsXP) 主に、フリーソフトでキャプチャした画像を編集するのに使っています。 先日までjpegで保存していたのですが、新たにbmpで保存した画像の編集にもチャレンジしようと思い始めました。 ところが、bmpで保存した画像を開こうとすると 「<ファイル名>を開くことができません。ファイル形式モジュールでファイルの解析を実行できません。」 と出て開く事ができません。 何故なのでしょうか? 分かる方、教えて下さい。お願いします。

  • fortran g95を使ってBMPを処理したい

    以前XP環境でVisual Fortran(VF)を使ってBMPファイルを読み込むプログラム使っていました. PCがWin7になった為,FreeのFortran g95を使用して同様の処理を行いたいのですが,上手くできません.例えば”test.bmp”と言う8bitのファイルを読み込みたいとしたとき, VFでは character*1078 temp integer*1 data open(10,file='test.bmp',form='binary') read(10)temp read(10)data このときwrite(*,*)dataは133とします. g95では"binary"が使用できず, character*1078 temp chracter*1 data open(10,file='test.bmp',form='formatted') read(10,*)temp read(10,*)data data2=ichar(data) write(*,*)data2は32となってしまいます. 画像の輝度は133で,VFで読み込んだ値となります. 上のプログラムで何を直せば g95でも正しい輝度情報を読めるのでしょうか? どうぞ宜しくお願いします.

  • BMP画像ファイルを、JPEG あるいは GIF に変換するフリーソフトは?

    現在、ペイントで描いた絵(BMP画像ファイル)をJPEGファイルに変換するのに、フリーソフトの『BatchGOO』を利用しています。でも、9-最高画質にしても、輪郭や色が汚くなり困っています。バイト数は1/10くらいに減っているようです。 この手のBMPファイルをJPEGに変換するのはどうも良くないようですね。大体JPEGは写真などの画像に向いていて、イラストや絵などには向いていないようですね。 では、どうしてバイト数を減らしたらいいのでしょうか?投稿先がJPEGか、GIFファイルを受け付けているのです。それで、本題なのですが、BMPファイルのイラストや絵を、多少画質を落として(落とす必要がありますので)JPEGやGIFファイルに変換できるフリーソフトはないでしょうか?BatchGOO は GIF には変換できないみたいです。 御存じの方がおられれば、ご教授願えませんか?有料で購入すればいいのでしょうが、これくらいしか利用しませんので、できればフリーソフトがいいのですが・・・。よろしくお願いします。

  • BMP → AVI 作成について

    みなさんはじめまして。 今回、AVIファイルを開き、ヘッダー及びBMPデータをバイナリ形式で書き込んでいくプログラムを作成しようと考えています。 AVIを開く時点での、AVIファイルのヘッダーのビット配列がわかりやすい表などで乗っているサイトをご存知の方おりましたら教えていただけないでしょうか。 よろしくお願いします。

  • bmpよりpngのほうがファイルサイズが大きいです

    24bit per pixelの32×32の画像があるのですが, pngファイルの方が4312バイトで、bmpファイルの方が3128バイトと、圧縮しているpngファイルの方が bmpファイルより大きくなってしまっています.理由が分かりません. また、bmpファイルのサイズも単純に考えれば 32×32×3=3072バイトのはずですが、サイズが一致しないのはなぜでしょうか。 理由が分かる方教えてください。よろしくお願いします。