ビットマップファイルの入出力

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:    }
のような計算が必要となります。

 ダウンロード

ビットマップファイルの読込み(bmprev.c)
//-----------------------------------------------------------------
// bmprev.c:
//    ビットマップ画像[Windows Bitmap]の入出力
//    :画像色の反転
//                 Last Update: <2004/12/15 02:46:24 A.Murakami>
//-----------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "bmp.h"

//-----------------------------------------------------------------
void editImage(BYTE* p_data,BMPInfo* bi);
//-----------------------------------------------------------------

int main(int argc,char* argv[])
{
    char *ifile;
    static char fname[] = "rev_image.bmp";
    BYTE *readByte;
    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;
    }
    // RGB値の反転
    editImage(readByte,&bi);
    // 出力
    output_bmp(fname,bi,readByte);
    // 後片付け
    free(readByte);
    return 0;
}

//-----------------------------------------------------------------
// 画像値の編集:色の反転
//-----------------------------------------------------------------
void editImage(BYTE* p_data,BMPInfo* bi)
{
    int i,ix,iy;
    int xsz = bi->Width,ysz = bi->Height;
    RGBQUAD rgb;
    if(bi->bCnt<24){
        for(i=0;i<bi->nColors;i++){
            bi->CIdx[i].rgbRed   = 255-bi->CIdx[i].rgbRed;
            bi->CIdx[i].rgbGreen = 255-bi->CIdx[i].rgbGreen;
            bi->CIdx[i].rgbBlue  = 255-bi->CIdx[i].rgbBlue;
        }
    } else {
        for(iy=0;iy<ysz;iy++){
            for(ix=0;ix<xsz;ix++){
                bmpGetRGB(p_data,*bi,ix,iy,&rgb);
                rgb.rgbRed   = 255 - rgb.rgbRed;
                rgb.rgbBlue  = 255 - rgb.rgbBlue;
                rgb.rgbGreen = 255 - rgb.rgbGreen;
                bmpSetRGB(p_data,*bi,ix,iy,rgb);
            }
        }
    }
}

実行結果
読取画像実行後:画像色の反転

実行結果
Gami[1186]% ./bmprev.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