📄 chap01.htm
字号:
lang=EN-US>}</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>//</span><span style='font-family:宋体;
"Times New Roman"'>将</span><span lang=EN-US>BITMAPFILEHEADER</span><span
style='font-family:宋体;"Times New Roman"'>结构从文件中读出,填写到</span><span lang=EN-US>bf</span><span
style='font-family:宋体;"Times New Roman"'>中</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>_lread(hf,(LPSTR)&bf,sizeof(BITMAPFILEHEADER)); </span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>//</span><span style='font-family:宋体;
"Times New Roman"'>将</span><span lang=EN-US>BITMAPINFOHEADER</span><span
style='font-family:宋体;"Times New Roman"'>结构从文件中读出,填写到</span><span lang=EN-US>bi</span><span
style='font-family:宋体;"Times New Roman"'>中</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>_lread(hf,(LPSTR)&bi,sizeof(BITMAPINFOHEADER));</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>//</span><span style='font-family:宋体;
"Times New Roman"'>我们定义了一个宏</span> #define WIDTHBYTES(i)
((i+31)/32*4)<span style='font-family:宋体;"Times New Roman";"Times New Roman"'>上面曾经</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>//</span><span style='font-family:宋体;
"Times New Roman"'>提到过,每一行的字节数必须是</span><span lang=EN-US>4</span><span
style='font-family:宋体;"Times New Roman"'>的整倍数,只要调用</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>//WIDTHBYTES(bi.biWidth*bi.biBitCount)</span><span style='font-family:
宋体;"Times New Roman"'>就能完成这一换算。举一个例</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>//</span><span style='font-family:宋体;
"Times New Roman"'>子,对于</span><span lang=EN-US>2</span><span
style='font-family:宋体;"Times New Roman"'>色图,如果图象宽是</span><span lang=EN-US>31</span><span
style='font-family:宋体;"Times New Roman"'>,则每一行需要</span><span lang=EN-US>31</span><span
style='font-family:宋体;"Times New Roman"'>位存储,合</span><span lang=EN-US>3</span><span style='font-family:
宋体;"Times New Roman"'>个</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>//</span><span style='font-family:宋体;
"Times New Roman"'>字节加</span><span lang=EN-US>7</span><span
style='font-family:宋体;"Times New Roman"'>位,因为字节数必须是</span><span lang=EN-US>4</span><span
style='font-family:宋体;"Times New Roman"'>的整倍数,所以应该是</span><span lang=EN-US>4</span><span
style='font-family:宋体;"Times New Roman"'>,而此时的</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>//biWidth=31,biBitCount=1,WIDTHBYTES(31*1)=4</span><span
style='font-family:宋体;"Times New Roman"'>,和我们设想的一样。</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>//</span><span style='font-family:宋体;
"Times New Roman"'>再举一个</span><span lang=EN-US>256</span><span
style='font-family:宋体;"Times New Roman"'>色的例子,如果图象宽是</span><span lang=EN-US>31</span><span
style='font-family:宋体;"Times New Roman"'>,则每一行需要</span><span lang=EN-US>31</span><span
style='font-family:宋体;"Times New Roman"'>个字节存</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>//</span><span style='font-family:宋体;
"Times New Roman"'>储,因为字节数必须是</span><span lang=EN-US>4</span><span
style='font-family:宋体;"Times New Roman"'>的整倍数,所以应该是</span><span lang=EN-US>32</span><span
style='font-family:宋体;"Times New Roman"'>,而此时的</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>//biWidth=31,biBitCount=8,WIDTHBYTES(31*8)=32</span><span
style='font-family:宋体;"Times New Roman"'>,我们设想的一样。你可</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>//</span><span style='font-family:宋体;
"Times New Roman"'>以多举几个例子来验证一下</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>//LineBytes</span><span style='font-family:宋体;"Times New Roman";"Times New Roman"'>为每一行的字节数</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>LineBytes=(DWORD)WIDTHBYTES(bi.biWidth*bi.biBitCount);</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>//ImgSize</span><span style='font-family:宋体;"Times New Roman";"Times New Roman"'>为实际的图象数据占用的字节数</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>ImgSize=(DWORD)LineBytes*bi.biHeight;</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>//NumColors</span><span style='font-family:宋体;"Times New Roman";"Times New Roman"'>为实际用到的颜色数</span>
<span
style='font-family:宋体;"Times New Roman"'>,即调色板数组中的颜色个数</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>if(bi.biClrUsed!=0)</span></p>
<p style='line-height:
18.0pt'><span lang=EN-US>//</span><span style='font-family:宋体;"Times New Roman";"Times New Roman"'>如果</span><span
lang=EN-US>bi.biClrUsed</span><span style='font-family:宋体;"Times New Roman";"Times New Roman"'>不为零,即为实际用到的颜色数</span></p>
<p style='line-height:
18.0pt'><span lang=EN-US>NumColors=(DWORD)bi.biClrUsed; </span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>else //</span><span style='font-family:宋体;"Times New Roman";"Times New Roman"'>否则,用到的颜色数为</span><span
lang=EN-US>2<sup>biBitCount</sup></span><span style='font-family:宋体;"Times New Roman";"Times New Roman"'>。</span></p>
<p style='line-height:
18.0pt'><span lang=EN-US>switch(bi.biBitCount){</span></p>
<p style='line-height:
18.0pt'><span lang=EN-US>case 1:</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>NumColors=2;</span></p>
<p style='line-height:18.0pt'><span> </span>
break;</p>
<p style='line-height:18.0pt;'><span>
</span>case 4:</p>
<p style='line-height:
18.0pt'><span lang=EN-US>NumColors=16;</span></p>
<p style='line-height:18.0pt'><span>
</span> break;</p>
<p style='line-height:18.0pt'><span> </span>case
8:</p>
<p style='line-height:18.0pt'><span>
</span> NumColors=256;</p>
<p style='line-height:18.0pt'><span>
</span> break;</p>
<p style='line-height:18.0pt'><span> </span>case
24:</p>
<p style='line-height:18.0pt'><span>
</span> NumColors=0; //<span style='font-family:
宋体;"Times New Roman"'>对于真彩色图,没用到调色板</span></p>
<p style='line-height:18.0pt'><span>
</span> break;</p>
<p style='line-height:18.0pt'><span
lang=EN-US>default: //</span><span style='font-family:宋体;"Times New Roman";"Times New Roman"'>不处理其它的颜色数,认为出错。</span></p>
<p style='line-height:
18.0pt'><span lang=EN-US>MessageBox(hWnd,"Invalid color numbers!","Error
Message",</span></p>
<p style='line-height:
18.0pt'><span lang=EN-US>MB_OK|MB_ICONEXCLAMATION);</span></p>
<p style='line-height:
18.0pt'><span lang=EN-US>_lclose(hf);</span></p>
<p style='line-height:18.0pt'><span>
</span>
return FALSE; //<span style='font-family:宋体;
"Times New Roman"'>关闭文件,返回</span><span lang=EN-US>FALSE</span></p>
<p style='line-height:
18.0pt'><span lang=EN-US>}</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>if(bf.bfOffBits!=(DWORD)(NumColors*sizeof(RGBQUAD)+</span></p>
<p style='line-height:
18.0pt'><span lang=EN-US>sizeof(BITMAPFILEHEADER)+</span></p>
<p style='line-height:
18.0pt'><span lang=EN-US>sizeof(BITMAPINFOHEADER)))</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>{</span></p>
<p style='line-height:
18.0pt'><span lang=EN-US>//</span><span style='font-family:宋体;"Times New Roman";"Times New Roman"'>计算出的偏移量与实际偏移量不符,一定是颜色数出错</span></p>
<p style='line-height:18.0pt'><span> </span> MessageBox(hWnd,"Invalid
color numbers!","Error Message",</p>
<p style='line-height:
18.0pt'><span lang=EN-US>MB_OK|MB_ICONEXCLAMATION);</span></p>
<p style='line-height:
18.0pt'><span lang=EN-US>_lclose(hf);</span></p>
<p style='line-height:
18.0pt'><span lang=EN-US>return FALSE; //</span><span style='font-family:宋体;
"Times New Roman"'>关闭文件,返回</span><span
lang=EN-US>FALSE</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>}</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>bf.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+</span></p>
<p style='line-height:
18.0pt'><span lang=EN-US>NumColors*sizeof(RGBQUAD)+ImgSize;</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>//</span><span style='font-family:宋体;
"Times New Roman"'>分配内存,大小为</span><span lang=EN-US>BITMAPINFOHEADER</span><span
style='font-family:宋体;"Times New Roman"'>结构长度加调色板</span><span lang=EN-US>+</span><span
style='font-family:宋体;"Times New Roman"'>实际位图</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>if((hImgData=GlobalAlloc(GHND,(DWORD)</span></p>
<p style='line-height:
18.0pt'><span lang=EN-US>(sizeof(BITMAPINFOHEADER)+</span></p>
<p style='line-height:
18.0pt'><span lang=EN-US>NumColors*sizeof(RGBQUAD)+</span></p>
<p style='line-height:
18.0pt'><span lang=EN-US>ImgSize)))==NULL)</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>{</span></p>
<p style='line-height:
18.0pt'><span lang=EN-US>//</span><span style='font-family:宋体;"Times New Roman";"Times New Roman"'>分配内存错误</span></p>
<p style='line-height:
18.0pt'><span lang=EN-US>MessageBox(hWnd,"Error alloc memory!","ErrorMessage",MB_OK|</span></p>
<p style='line-height:18.0pt'><span>
</span>MB_ICONEXCLAMATION);</p>
<p style='line-height:
18.0pt'><span lang=EN-US>_lclose(hf);</span></p>
<p style='line-height:
18.0pt'><span lang=EN-US>return FALSE; //</span><span style='font-family:宋体;
"Times New Roman"'>关闭文件,返回</span><span
lang=EN-US>FALSE</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>}</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>//</span><span style='font-family:宋体;
"Times New Roman"'>指针</span><span lang=EN-US>lpImgData</span><span
style='font-family:宋体;"Times New Roman"'>指向该内存区</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData); </span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>//</span><span style='font-family:宋体;
"Times New Roman"'>文件指针重新定位到</span><span lang=EN-US>BITMAPINFOHEADER</span><span
style='font-family:宋体;"Times New Roman"'>开
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -