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: // ビットマップ画像[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]% |