📄 chap04.htm
字号:
18.0pt'><span lang=EN-US>for(x=0;x<bi.biWidth;x++){</span></p>
<p style='line-height:
18.0pt'><span lang=EN-US>lpIntPtr=(int *)lpIntBuf+(bi.biHeight-1-y)*LineBytes+x;</span></p>
<p style='line-height:18.0pt'><span>
</span>num=(unsigned char)*lpIntPtr;</p>
<p style='line-height:18.0pt'><span>
</span>if ( num > 128 ){ //128<span style='font-family:宋体;"Times New Roman";"Times New Roman"'>是中值</span></p>
<p style='line-height:18.0pt'><span>
</span>*lpIntPtr=255; //<span style='font-family:宋体;
"Times New Roman"'>打白点</span></p>
<p style='line-height:18.0pt'><span>
</span>e=(float)(num-255.0); //<span style='font-family:宋体;
"Times New Roman"'>计算误差</span></p>
<p style='line-height:18.0pt'><span>
</span>}</p>
<p style='line-height:
18.0pt'><span> </span>else{</p>
<p style='line-height:18.0pt'><span>
</span>*lpIntPtr=0; //<span style='font-family:宋体;
"Times New Roman"'>打黑点</span></p>
<p style='line-height:18.0pt'><span>
</span>e=(float)num; //<span style='font-family:宋体;
"Times New Roman"'>计算误差</span></p>
<p style='line-height:18.0pt'><span>
</span>}</p>
<p style='line-height:18.0pt'><span>
</span>if(x<bi.biWidth-1){ //<span style='font-family:宋体;
"Times New Roman"'>注意判断边界</span></p>
<p style='line-height:18.0pt'><span>
</span>f=(float)*(lpIntPtr+1);</p>
<p style='line-height:18.0pt'><span>
</span>f+=(float)( (3.0/8.0) * e);</p>
<p style='line-height:
18.0pt'><span> </span>
*(lpIntPtr+1)=(int)f; //<span style='font-family:宋体;
"Times New Roman"'>向左传播</span></p>
<p style='line-height:
18.0pt'><span lang=EN-US>}</span></p>
<p style='line-height:
18.0pt'><span> </span>if(y<bi.biHeight-1){
//<span style='font-family:宋体;
"Times New Roman"'>注意判断边界</span></p>
<p style='line-height:18.0pt'><span>
</span>f=(float)*(lpIntPtr-LineBytes);</p>
<p style='line-height:18.0pt'><span>
</span>f+=(float)( (3.0/8.0) * e);</p>
<p style='line-height:18.0pt'><span>
</span>*(lpIntPtr-LineBytes)=(int)f; //<span style='font-family:宋体;
"Times New Roman"'>向下传播</span></p>
<p style='line-height:18.0pt'><span>
</span>f=(float)*(lpIntPtr-LineBytes+1);</p>
<p style='line-height:18.0pt'><span>
</span>f+=(float)( (1.0/4.0) * e);</p>
<p style='line-height:18.0pt'><span>
</span>*(lpIntPtr-LineBytes+1)=(int)f; //<span style='font-family:宋体;
"Times New Roman"'>向右下传播</span></p>
<p style='line-height:18.0pt'><span>
</span>}</p>
<p style='line-height:18.0pt'><span> </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>int</span><span
style='font-family:宋体;"Times New Roman"'>类型的缓冲区拷贝到</span><span lang=EN-US>char</span><span
style='font-family:宋体;"Times New Roman"'>类型的缓冲区</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>for(y=0;y<bi.biHeight;y++){</span></p>
<p style='line-height:
18.0pt'><span lang=EN-US>lpTempPtr=(char *)lpTempImgData+(BufSize-LineBytes-y*LineBytes);</span></p>
<p style='line-height:
18.0pt'><span lang=EN-US>lpIntPtr=(int *)lpIntBuf+(bi.biHeight-1-y)*LineBytes;</span></p>
<p style='line-height:
18.0pt'><span lang=EN-US>for(x=0;x<bi.biWidth;x++){</span></p>
<p style='line-height:18.0pt'><span>
</span>tempnum=*(lpIntPtr++);</p>
<p style='line-height:18.0pt'><span>
</span>if(tempnum>255) tempnum=255;</p>
<p style='line-height:18.0pt'><span>
</span>else if (tempnum<0) tempnum=0;</p>
<p style='line-height:18.0pt'><span>
</span>*(lpTempPtr++)=(unsigned char)tempnum;</p>
<p style='line-height:18.0pt'><span> </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(hBitmap!=NULL)</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>DeleteObject(hBitmap);</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>hDc=GetDC(hWnd);</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> </span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>hBitmap=CreateDIBitmap(hDc,(LPBITMAPINFOHEADER)lpTempImgData,</span></p>
<p style='line-height:
18.0pt'><span lang=EN-US>(LONG)CBM_INIT,</span></p>
<p style='line-height:
18.0pt'><span lang=EN-US>(LPSTR)lpTempImgData+</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>(LPBITMAPINFO)lpTempImgData,</span></p>
<p style='line-height:
18.0pt'><span lang=EN-US>DIB_RGB_COLORS);</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>hf=_lcreat("c:\\steinberg.bmp",0);</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>_lwrite(hf,(LPSTR)&bf,sizeof(BITMAPFILEHEADER)); </span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>_lwrite(hf,(LPSTR)lpTempImgData,BufSize);</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>//</span><span style='font-family:宋体;
"Times New Roman"'>释放内存和资源</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>ReleaseDC(hWnd,hDc);</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>GlobalUnlock(hImgData);</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>LocalUnlock(hTempImgData);</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>LocalFree(hTempImgData);</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>LocalUnlock(hIntBuf);</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>LocalFree(hIntBuf);</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>return TRUE;</span></p>
<p style='line-height:18.0pt'><span lang=EN-US>}</span></p>
<p style='line-height:18.0pt'><span
style='font-family:宋体;"Times New Roman"'>要注意的是,误差传播有时会引起流水效应,即误差不断向下,向右累加传播。解决的办法是:奇数行从左到右传播,偶数行从右到左传播。</span></p>
<h2> <span
lang=EN-US>4.3</span> <span lang=EN-US> </span><a name="_Toc486331880"></a><a
name="_Toc486332880"></a><a name="_Toc486338989"></a><a name="_Toc454810854"></a><a
name="_Toc454856628"><span><span>将<span lang=EN-US>bmp</span></span></span></a><span><span><span style='font-family:黑体;'>文件转换为</span><span lang=EN-US>txt</span></span></span><span><span><span style='font-family:黑体;'>文件</span></span></span></h2>
<p style='line-height:18.0pt'><span
style='font-family:宋体;"Times New Roman"'>在讲图案化技术时,我突然想到了一个非常有趣的应用,那就是</span><span lang=EN-US>bmp2txt</span><span
style='font-family:宋体;"Times New Roman"'>。如果你喜欢上</span><span lang=EN-US>BBS(</span><span
style='font-family:宋体;"Times New Roman"'>电子公告牌系统</span><span lang=EN-US>)</span><span
style='font-family:宋体;"Times New Roman"'>,你可能想做一个花哨的签名档。瞧,这是我好朋友</span><span lang=EN-US>Casper</span><span
style='font-family:宋体;"Times New Roman"'>的签名档</span><span lang=EN-US>(</span><span style='font-family:
宋体;"Times New Roman"'>见图</span><span
lang=EN-US>4.8)</span><span style='font-family:宋体;
"Times New Roman"'>,胖乎乎的,是不是特别可爱?</span></p>
<p class=a style='line-height:18.0pt'><span lang=EN-US> <img width=360 height=289
src="chap04.files/image016.jpg" v:shapes="_x0000_i1036"> </span></p>
<p align=center style='text-align:center;line-height:18.0pt'><b><span
style='font-family:宋体;"Times New Roman"'>图</span>4.8 Casper</b><b><span
style='font-family:宋体;"Times New Roman"'>的签名档</span><span lang=EN-US></span></b></p>
<p style='line-height:18.0pt'><span
style='font-family:宋体;"Times New Roman"'>你仔细观察一下,就会发现,这是一幅全部由字符组成的图,因为在</span><span lang=EN-US>BBS</span><span
style='font-family:宋体;"Times New Roman"'>中只能出现文本的东西。那么,这幅图是怎么做出来的呢?难道是自己一个字符一个字符拼出来的。当然不是了,有一种叫</span><span
lang=EN-US>bmp2txt</span><span style='font-family:宋体;"Times New Roman";"Times New Roman"'>的应用程序</span><span
lang=EN-US>(2</span><span style='font-family:宋体;
"Times New Roman"'>的发音和“</span><span lang=EN-US>to</span><span
style='font-family:宋体;"Times New Roman"'>”一样,所以如此命名</span><span lang=EN-US>)</span><span
style='font-family:宋体;"Times New Roman"'>,能把位图文件转换成和图案很相似的字符文本。是不是觉得很神奇?其实原理很简单,用到了和图案化技术类似的思想:首先将位图分成同样大小的小块,求出每一块灰度的平均值,然后和每个字符的灰度做比较,找出最接近的那个字符,来代表这一小块图象。那么,怎么确定字符的灰度呢?做下面的实验就明白
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -