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