要如何將BMP的檔案讀入C++的陣列中
然後可以取得以下資料
FILE_HEADER Dec Hex
bfType= 19778 4d42
bfSize= 17464 4438
bfReserved1= 0 0
bfReserved2= 0 0
bfOffBits= 1078 436
INFO_HEADER Dec Hex
biSize= 40 28
biWidth= 128 80
biHeight= 128 80
biPlanes= 1 1
biBitCount= 8 8
biCompression= 0 0
biSizeImage= 16384 4000
biXPelsPerMeter= 2833 b11
biYPelsPerMeter= 2833 b11
biClrUsed= 0 0
biClrImportant= 0 0
還要可以旋轉180度、對換顏色(底片)
請高手指教
2006-12-19 17:17:21 · 1 個解答 · 發問者 NYY 1 in 電腦與網際網路 ➔ 程式設計
int read_bmp(char *filename, unsigned char ***bmp, int *height, int *width)
{ long *hed;
int i, j, k, w;
unsigned char head[1079], l, mod, *tmp_buf;
FILE *f;
hed = (long *) &head[2];
if ((f = fopen(filename, "rb")) == NULL) return 1;
if (fread(head, 1, 54, f) != 54) return 2;
if (head[0] != 'B' || head[1] != 'M') return 3; // BMP head
fseek(f, 0, SEEK_END);
if (ftell(f) - hed[0]) return 4; // file size != internal record
mod = head[28]; // bit / pixel
if (mod != 1 && mod != 8) return 5;
if (head[30]) return 6; // bitmap compression method
*width = hed[4], *height = hed[5];
if ((tmp_buf = (unsigned char *) malloc(hed[8])) == NULL) return 7;
if ( !(*bmp = (unsigned char **)malloc(*height *sizeof(**bmp)))) return 8;
if ( (**bmp = (unsigned char *) malloc(*width * *height + 7)) == NULL) return 9;
fseek(f, hed[2], SEEK_SET); // to bmp data start
if (fread(tmp_buf, 1, (size_t)hed[8]-1, f) != hed[8]-1) return 10; // read error
for (w=i=0; i<*height; i++, w+=*width) // Calculate index for speedup
(*bmp)[i] = &(**bmp)[w];
if (mod == 1)
{ w = (int) ( ((*width-1) >> 5) +1 ) << 2;
for (i=(int)(*height-1); i>=0; i--)
{ for (j=0; j<*width-7; j+=8)
{ l = tmp_buf[i*w + (j>>3)];
for (k=0; k<8; k++)
{ (**bmp)[(*height-i-1)**width + j + k] = l & 128 ? 0 : 255;
l <<= 1;
} }
l = tmp_buf[i*w + (j>>3)];
for (k=0; k<(*width&7); k++)
{ (**bmp)[(*height-i-1)**width + j + k] = l & 128 ? 0 : 255;
l <<= 1;
} } }
else if (mod == 8)
{ w = (int) (((*width-1)>>2) +1) << 2;
for (i=(int)(*height-1); i>=0; i--)
{ k = *height - i -1;
for (j=0; j<*width; j++)
(*bmp)[k][j] = tmp_buf[i*w + j];
} }
free(tmp_buf);
if (fclose(f)) return 11;
return 0;
}
這是我一年多前寫的可以讀未壓縮的 2色或 256灰階的 BMP 檔的程式。
你若要 24 bits 色,我也有寫好的。
hight 和 width 會傳回圖檔的高和寬。
如果有錯,return 非 0值。(1~11)
傳回的 bmp 是個二維陣列,每個值是每個點的 0~255黑度。
若是黑白2色的,傳回 0 或 255兩種黑度。
用法:
unsigned char **bmp;
int h, w;
if (read_bmp("檔名", &bmp, &h, &w) 錯誤處理;
使用 bmp[ ][ ]內容;
free (*bmp); free(bmp);
BMP 檔沒有底色、透明度!換底色,要先設底色!
轉 180 度:在使用 處寫上
設好 tmp[w][h]; (用 malloc 或 new)
for (i=0; i
就可以了。
2006-12-21 21:54:05 補充:
我不寄信到個人信箱,你的知識+ 信箱沒開。
已有人問,也 post 上解答了。
http://tw.knowledge.yahoo.com/question/question?qid=1606122101082
2006-12-19 19:42:15 · answer #1 · answered by ? 7 · 0⤊ 0⤋