<<戻る

日記 intime o'

bmp(24bit) - ファイルフォーマット 2008/5/26(Mon)
画像BMP(24bit)の中身を書いてみる。数字は
特に何もない限り10進法。0xが頭に付く数字
は16進法。単位はbyte。

(1) データは大きく3つに分けられて上から順に

ファイルヘッダoffset:0x00data size:14(=0x0e)
情報・ヘッダoffset:0x0edata size:40(=0x28)
データ部offset:0x36data size:file size
(2) それぞれについて詳しく (2-ⅰ) ファイルヘッダ そのファイルの基本情報が5つ含み、先頭から
ファイルタイプdata size:2bitBMPの場合は"BM"
ファイルサイズdata size:4bit画像ファイルサイズ(bit)
予約領域Adata size:2bitいつか使うメモリ領域其の壱 初期は0
予約領域Bdata size:2bit     〃    其の弐 初期は0
データ部のオフセットdata size:4bitオフセット。(埋め合わせ)
(2-ⅱ) 情報・ヘッダ 画像についての情報を11つ含み、先頭から
情報ヘッダsize data size:4bit 情報ヘッダのサイズ。0x28
画像の幅data size:4bit 画像の幅 単位はpixel
画像の高さdata size:4bit 画像の高さ 単位はpixel
プレーン数data size:2bit 何か色の穏やかさみたいな。1
色数/画素data size:2bit 画素数 単位はbit24
圧縮形式data size:4bit0x0
画像サイズdata size:4bitデータ部サイズ
水平解像度data size:4bit 単位はppm0
垂直解像度data size:4bit 単位はppm0
パレット色数data size:4bit0
パレットindexdata size:4bit0
(2-ⅲ) データ部 1画素をRGB(赤緑青)の輝度、それぞれ0~255に分けて表す。 R,G,Bそれぞれが1byte(1画素は3byte)。 下の行から上行、各行で左から右、つまり +---+---+---+---+---+ |s-w|… |s-2|s-1| s | +---+---+---+---+---+  ::::::::: +---+---+-- |w+1|w+2|w+3|… +---+---+---+---+---+ |000|001|002| …| w | +---+---+---+---+---+ の1~s順にB,G,Rを並べる。1行終えた時、1行分の情報byte数が4の倍数に なるよう0で埋める。つまり3w+x = (4の倍数)となるような最小の0以上の 整数xを計算してx個、0で埋める、ということ。 (3) 使用例(C言語) /** * "test.bmp"を暗転した画像を"out.bmp"として作る **/ #include "stdio.h" main(){ //変数宣言 FILE *fp,*fp2;//ファイルポインタ char c;//読み込んだ文字(1文字) int i;//cが何文字目か fp=fopen("test.bmp","rb");//ファイルを開く fp2=fopen("out.bmp","wb"); for(i=0;fread(&c,sizeof(char),1,fp);i++){//cに1文字ずつ読み込み c=i<36?c:255-c; //36文字目まではヘッダなので弄らない。 //それ以降はc=255-c fwrite(&c,sizeof(char),1,fp2);//fp2に出力 } fclose(fp); //ファイルのクローズ fclose(fp2); } 暗転という変換の処理は 輝度を255/2を軸に線対称に移動させればよい。 (0は255に、255は0に。tは255-tに。)
2010/3/19 割と重要な手直し。

コメ(0) | トラ(0)


(c)Kero's World