做作業時發現求得圖像寬度是負數,用的int,溢出了?應該不是溢出了,換了long 也不行,應該是沒把圖片轉換bmp格式,應該用windows畫圖工具轉換
1、位圖文件頭BITMAPFILEHEADER,是一個結構,其定義如下:
typedef struct tagBITMAPFILEHEADER {
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER;
這個結構的長度是固定的,為14個字節(WORD為無符號16位整數,DWORD為無符號32位整數),各個域的說明如下:
bfType
指定文件類型,必須是0x424D,即字符串“BM”,也就是說所有.bmp文件的頭兩個字節都是“BM”。
bfSize
指定文件大小,包括這14個字節。
bfReserved1,bfReserved2
為保留字,不用考慮
bfOffBits
為從文件頭到實際的位圖數據的偏移字節數
位圖文件頭分4部分,共14字節:
名稱 |
占用空間 |
內容 |
實際數據 |
bfType |
2字節 |
標識,就是“BM”二字 |
BM |
bfSize |
4字節 |
整個BMP文件的大小 |
0x000C0036(786486) |
bfReserved1/2 |
4字節 |
保留字,沒用 |
0 |
bfOffBits |
4字節 |
偏移數,即 位圖文件頭+位圖信息頭+調色板 的大小 |
0x36(54) |
注意,Windows的數據是倒着念的,這是PC電腦的特色。如果一段數據為50 1A 25 3C,倒着念就是3C 25 1A50,即0x3C251A50。因此,如果bfSize的數據為36 00 0C 00,實際上就成了0x000C0036,也就是0xC0036。
2、位圖信息頭BITMAPINFOHEADER,也是一個結構,其定義如下:
typedef struct tagBITMAPINFOHEADER{
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER;
這個結構的長度是固定的,為40個字節(LONG為32位整數),各個域的說明如下:
biSize
指定這個結構的長度,為40。
biWidth
指定圖象的寬度,單位是象素。
biHeight
指定圖象的高度,單位是象素。
biPlanes
必須是1,不用考慮。
biBitCount
指定表示顏色時要用到的位數,常用的值為1(黑白二色圖), 4(16色圖), 8(256色), 24(真彩色圖)(新的.bmp格式支持32位色,這里就不做討論了)。
biCompression
指定位圖是否壓縮,有效的值為BI_RGB,BI_RLE8,BI_RLE4,BI_BITFIELDS(都是一些Windows定義好的常量)。要說明的是,Windows位圖可以采用RLE4,和RLE8的壓縮格式,但用的不多。我們今后所討論的只有第一種不壓縮的情況,即biCompression為BI_RGB的情況。
biSizeImage
指定實際的位圖數據占用的字節數,其實也可以從以下的公式中計算出來:
biSizeImage=biWidth’ × biHeight
要注意的是:上述公式中的biWidth’必須是4的整倍數(所以不是biWidth,而是biWidth’,表示大於或等於biWidth的,最接近4的整倍數。舉個例子,如果biWidth=240,則biWidth’=240;如果biWidth=241,biWidth’=244)。
如果biCompression為BI_RGB,則該項可能為零
biXPelsPerMeter
指定目標設備的水平分辨率,單位是每米的象素個數,關於分辨率的概念。
biYPelsPerMeter
指定目標設備的垂直分辨率,單位同上。
biClrUsed
指定本圖象實際用到的顏色數,如果該值為零,則用到的顏色數為2biBitCount。
biClrImportant
指定本圖象中重要的顏色數,如果該值為零,則認為所有的顏色都是重要的。