ビットマップファイルの読込み

Windows用ビットマップ(1/16/256色,フルカラー:24bit,32bit)の読取例です。ビットマップはそれぞれの色に応じて表示することが可能となっています。

ビットマップの表示では、1ライン当たりのデータ数が4Byte(long)に限られているため、ビットマップファイルからのデータの読取後の表示には注意が必要です。1ラインが4で割り切れない場合は足りないバイト数を加えて計算する必要があります。

具体的には、
 bmp.c : read_bmp() 関数内
  071:    // 1 ラインあたりのデータ数: 4byte 境界にあわせる
  072:    Line = (bmih.biWidth * bmih.biBitCount)/8;
  073:    if((Line%4) != 0){
  074:        Line = ((Line/4)+1)*4;
  075:    }
のような計算が必要となります。

 ダウンロード

ビットマップファイルの読込み(list_36.c)
//-----------------------------------------------------------------
// list_36.c:
//    ビットマップ画像[Windows Bitmap]の読み込み
//    & RGB値毎に画像保存(PGM形式)
//                 Last Update: <2004/11/25 08:22:18 A.Murakami>
//-----------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "bmp.h"

int main(int argc,char* argv[])
{
    FILE *fp[3];
    int i,ix,iy,xsz,ysz;
    char *ifile;
    static char* fname[] = {"r.pgm","g.pgm","b.pgm"};
    BYTE *readByte,c[3];
    RGBQUAD rgb;
    BMPInfo bi;
    //-----------------------------------------------------------------
    // ファイル名
    //-----------------------------------------------------------------
    if(argc<2) {
        fprintf(stderr,"USAGE: %s bmpfile\n",argv[0]);
        return 0;
    }
    else ifile = argv[1];
    //-----------------------------------------------------------------
    // ビットマップの読取り
    //-----------------------------------------------------------------
    readByte = read_bmp(ifile,&bi);
    if(readByte == NULL){
        fprintf(stderr,"bmp read error.\n");
        return 0;
    }
    xsz = bi.Width; ysz = bi.Height;
    //-----------------------------------------------------------------
    // RGB値の出力[グレイスケール:PGM]
    //-----------------------------------------------------------------
    for(i=0;i<3;i++){
        fp[i] = fopen(fname[i],"w");
        fprintf(fp[i],"P2\n");
        fprintf(fp[i],"%d %d\n",xsz,ysz);
        fprintf(fp[i],"255\n");
    }
    for(iy=0;iy<ysz;iy++){
        for(ix=0;ix<xsz;ix++){
            bmpGetRGB(readByte,bi,ix,iy,&rgb);
            c[0] = rgb.rgbRed;
            c[1] = rgb.rgbBlue;
            c[2] = rgb.rgbGreen;
            for(i=0;i<3;i++) fprintf(fp[i],"%d ",c[i]);
        }
        for(i=0;i<3;i++) fprintf(fp[i],"\n");
    }
    for(i=0;i<3;i++) fclose(fp[i]);
    // 後片付け
    free(readByte);
    return 0;
}

実行結果
読取画像実行後:R成分 実行後:G成分実行後:B成分

実行結果
Gami[1186]% ./list_36.exe klogo.bmp
[bitmap file header]
         bfType = 19778
         bfSize = 103[kbyte]
    bfReserved1 = 0
    bfReserved2 = 0
      bfOffBits = 1078

[bitmap info header]
         biSize = 0[kbyte]
        biWidth = 320
       biHeight = 320
       biPlanes = 1
     biBitCount = 8
  biCompression = 0
    biSizeImage = 102400
biXPelsPerMeter = 0
biYPelsPerMeter = 0
      biClrUsed = 256
 biClrImportant = 256

Gami[1187]%
inserted by FC2 system