BMPæ件ç±æ件头ãä½å¾ä¿¡æ¯å¤´ãé¢è²ä¿¡æ¯åå¾å½¢æ°æ®åé¨åç»æã
ä¸ãBMPæ件头
BMPæ件头æ°æ®ç»æå«æBMPæ件çç±»åãæ件大å°åä½å¾èµ·å§ä½ç½®çä¿¡æ¯ãå
¶ç»æå®ä¹å¦ä¸:
typedef struct tagBITMAPFILEHEADER
{
WORD bfType; // ä½å¾æ件çç±»åï¼å¿
须为BM
DWORD bfSize; // ä½å¾æ件ç大å°ï¼ä»¥åè为åä½
WORD bfReserved1; // ä½å¾æ件ä¿çåï¼å¿
须为0
WORD bfReserved2; // ä½å¾æ件ä¿çåï¼å¿
须为0
DWORD bfOffBits; // ä½å¾æ°æ®çèµ·å§ä½ç½®ï¼ä»¥ç¸å¯¹äºä½å¾æ件头çå移é表示ï¼ä»¥åè为åä½
} BITMAPFILEHEADER; äºãä½å¾ä¿¡æ¯å¤´
BMPä½å¾ä¿¡æ¯å¤´æ°æ®ç¨äºè¯´æä½å¾ç尺寸çä¿¡æ¯ãå
¶ç»æå®ä¹å¦ä¸:
typedef struct tagBITMAPINFOHEADER
{
DWORD biSize; // æ¬ç»ææå ç¨åèæ°
LONG biWidth; // ä½å¾ç宽度ï¼ä»¥åç´ ä¸ºåä½
LONG biHeight; // ä½å¾çé«åº¦ï¼ä»¥åç´ ä¸ºåä½
WORD biPlanes; // ç®æ 设å¤ç级å«ï¼å¿
须为1
WORD biBitCount// æ¯ä¸ªåç´ æéçä½æ°ï¼å¿
é¡»æ¯1(åè²),4(16è²)ï¼8(256è²)æ24(ç彩è²)ä¹ä¸
DWORD biCompression; // ä½å¾å缩类åï¼å¿
é¡»æ¯ 0(ä¸å缩),1(BI_RLE8å缩类å)æ2(BI_RLE4å缩类å)ä¹ä¸
DWORD biSizeImage; // ä½å¾ç大å°ï¼ä»¥åè为åä½
LONG biXPelsPerMeter; // ä½å¾æ°´å¹³å辨çï¼æ¯ç±³åç´ æ°
LONG biYPelsPerMeter; // ä½å¾åç´å辨çï¼æ¯ç±³åç´ æ°
DWORD biClrUsed;// ä½å¾å®é
使ç¨çé¢è²è¡¨ä¸çé¢è²æ°
DWORD biClrImportant;// ä½å¾æ¾ç¤ºè¿ç¨ä¸éè¦çé¢è²æ°
} BITMAPINFOHEADER; ä¸ãé¢è²è¡¨åä½å¾ä¿¡æ¯
é¢è²è¡¨ç¨äºè¯´æä½å¾ä¸çé¢è²ï¼æè¥å¹²ä¸ªè¡¨é¡¹ï¼æ¯ä¸ä¸ªè¡¨é¡¹æ¯ä¸ä¸ªRGBQUADç±»åçç»æï¼å®ä¹ä¸ç§é¢è²ãRGBQUADç»æçå®ä¹å¦ä¸:
typedef struct tagRGBQUAD
{
BYTErgbBlue;// èè²ç亮度(å¼èå´ä¸º0-255)
BYTErgbGreen; // 绿è²ç亮度(å¼èå´ä¸º0-255)
BYTErgbRed; // 红è²ç亮度(å¼èå´ä¸º0-255)
BYTErgbReserved;// ä¿çï¼å¿
须为0
} RGBQUAD; ä½å¾ä¿¡æ¯å¤´åé¢è²è¡¨ç»æä½å¾ä¿¡æ¯ï¼BITMAPINFOç»æå®ä¹å¦ä¸:
typedef struct tagBITMAPINFO
{
BITMAPINFOHEADER bmiHeader; // ä½å¾ä¿¡æ¯å¤´
RGBQUAD bmiColors[1]; // é¢è²è¡¨
} BITMAPINFO;åãæ°æ®è¯»ååé¢è²å离
Bmpæ件æ个éè¦ç¹æ§ï¼é£å°±æ¯å¯¹äºæ°æ®åºåèè¨ï¼æ¯è¡çæ°æ®å®å¿
é¡»å满4åèï¼å¦æ没æ满ï¼åç¨åä½çæ°æ®æ¥è¡¥é½ãè¿ä¸ªç¹æ§ç´æ¥å½±åå°æ们读åä½å¾æ°æ®çæ¹æ³ï¼å 为å¨æ们çæ¥ï¼x,yï¼çæ°æ®åºè¯¥å¨ y*width+xè¿æ ·çä½ç½®ä¸ ä½æ¯å 为ä¼æåä½ä¿¡æ¯ é£ä¹å¿
é¡»å°widthç¨widthï¼è¯¥è¡çåä½éæ¥å¤çï¼èç±äºä½å¾æ件æä¸åçä½æ°ï¼æ以è¿æ ·ç计ç®ä¹ä¸å°½ç¸åã
1ä½ï¼
for(int i=0; i<height; i++)
for(int j=0; j<width; j=j+8)
{
int k=7;
while(k>=0)
{
color[i][k+j]=buffer[n]%2;
buffer[n]=buffer[n]/2;
k--;
}
n++;
}4ä½ï¼ int pitch;
if(width%8==0)
pitch=width;
else
pitch=width+8-width%8; for(int i=0; i<height; i++)
for(int j=0; j<width; j++)
{
int index;
if(j%2==0)
index = buffer[(i*pitch+j)/2]/16;
if(j%2==1)
index = buffer[(i*pitch+j)/2]%16; UCHAR r=quad[index].rgbRed;
UCHAR g=quad[index].rgbGreen;
UCHAR b=quad[index].rgbBlue;
8ä½ï¼ int pitch;
if(width%4==0)
{
pitch=width;
}
else
{
pitch=width+4-width%4;
}
index=buffer[y*pitch+x]; //å 为8ä½ä½å¾çæ°æ®åºååæ¾çæ¯è°è²æ¿ç´¢å¼å¼ï¼æ以åªé读åè¿ä¸ªindex
é¢è²å离ï¼
UCHAR r=quad[index].rgbRed;
UCHAR g=quad[index].rgbGreen;
UCHAR b=quad[index].rgbBlue;
16ä½ï¼
int pitch=width+width%2;
buffer[(y*pitch+x)*2]
buffer[(y*pitch+x)*2ï¼1]
两个UCHARå
ï¼åæ¾çæ¯(x,y)å¤çé¢è²ä¿¡æ¯
é¢è²å离ï¼
1.è¥bitmapinfoheaderä¸çbiCompression为BI_RGBæ¶ï¼ä¸º555æ ¼å¼ï¼å离代ç å¦ä¸ï¼
UCHAR b=buffer[(i*pitch+j)*2]&0x1F;
UCHAR g=(((buffer[(i*pitch+j)*2+1]<<6)&0xFF)>>3)+(buffer[(i*pitch+j)*2]>>5);
UCHAR r=(buffer[(i*pitch+j)*2+1]<<1)>>3;
2.è¥bitmapinfoheaderä¸çbiCompression为BI_BITFIELDSæ¶ï¼å¨ä½å¾æ°æ®åºåååå¨ä¸ä¸ªRGBæ©ç çæè¿° æ¯3个DWORDå¼ï¼
æ们åªéè¦è¯»åå
¶ä¸çRæè
Gçæ©ç ï¼æ¥å¤ææ¯é£ç§æ ¼å¼ã 以红è²æ©ç ä¸ºä¾ 0111110000000000çæ¶åå°±æ¯555æ ¼å¼
1111100000000000å°±æ¯565æ ¼å¼ã 565æ ¼å¼å离代ç å¦ä¸ï¼
UCHAR b=buffer[(i*pitch+j)*2]&0x1F;
UCHAR g=(((buffer[(i*pitch+j)*2+1]<<5)&0xFF)>>2)+(buffer[(i*pitch+j)*2]>>5);
UCHAR r=buffer[(i*pitch+j)*2+1]>>3;
24ä½ï¼
int pitch=width%4;
buffer[(y*width+x)*3+y*pitch];
buffer[(y*width+x)*3+y*pitch+1];
buffer[(y*width+x)*3+y*pitch+2];
é¢è²å离ï¼
UCHAR b=buffer[(i*width+j)*3+realPitch];
UCHAR g=buffer[(i*width+j)*3+1+realPitch];
UCHAR r=buffer[(i*width+j)*3+2+realPitch];32ä½ï¼
ç±äºä¸ä¸ªè±¡ç´ å°±æ¯4åè æ以æ éè¡¥é½
é¢è²å离ï¼
UCHAR b=buffer[(i*width+j)*4];
UCHAR g=buffer[(i*width+j)*4+1];
UCHAR r=buffer[(i*width+j)*4+2];
温馨提示:答案为网友推荐,仅供参考