⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 第4章 图象的半影调和抖动技术.htm

📁 介绍了图像的半影调和抖动技术的原理和数学基础.
💻 HTM
📖 第 1 页 / 共 5 页
字号:
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>lpIntPtr=(int 
*)lpIntBuf+(bi.biHeight-1-y)*LineBytes;</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN 
lang=EN-US>for(x=0;x&lt;bi.biWidth;x++){</SPAN></P>
<P 
style="LINE-HEIGHT: 18pt"><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN>tempnum=*(lpIntPtr++);</P>
<P 
style="LINE-HEIGHT: 18pt"><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN>if(tempnum&gt;255) tempnum=255;</P>
<P 
style="LINE-HEIGHT: 18pt"><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN>else if (tempnum&lt;0) tempnum=0;</P>
<P 
style="LINE-HEIGHT: 18pt"><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN>*(lpTempPtr++)=(unsigned char)tempnum;</P>
<P style="LINE-HEIGHT: 18pt"><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>}</P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>}</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>if(hBitmap!=NULL)</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>DeleteObject(hBitmap);</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>hDc=GetDC(hWnd);</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>//</SPAN><SPAN 
style="FONT-FAMILY: 宋体">产生新的位图</SPAN><SPAN lang=EN-US> </SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN 
lang=EN-US>hBitmap=CreateDIBitmap(hDc,(LPBITMAPINFOHEADER)lpTempImgData,</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>(LONG)CBM_INIT,</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>(LPSTR)lpTempImgData+</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN 
lang=EN-US>sizeof(BITMAPINFOHEADER)+</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN 
lang=EN-US>NumColors*sizeof(RGBQUAD),</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN 
lang=EN-US>(LPBITMAPINFO)lpTempImgData,</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>DIB_RGB_COLORS);</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN 
lang=EN-US>hf=_lcreat("c:\\steinberg.bmp",0);</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN 
lang=EN-US>_lwrite(hf,(LPSTR)&amp;bf,sizeof(BITMAPFILEHEADER)); </SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN 
lang=EN-US>_lwrite(hf,(LPSTR)lpTempImgData,BufSize);</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>_lclose(hf);</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>//</SPAN><SPAN 
style="FONT-FAMILY: 宋体">释放内存和资源</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>ReleaseDC(hWnd,hDc);</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>GlobalUnlock(hImgData);</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN 
lang=EN-US>LocalUnlock(hTempImgData);</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN 
lang=EN-US>LocalFree(hTempImgData);</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>LocalUnlock(hIntBuf);</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>LocalFree(hIntBuf);</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>return TRUE;</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>}</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN 
style="FONT-FAMILY: 宋体">要注意的是,误差传播有时会引起流水效应,即误差不断向下,向右累加传播。解决的办法是:奇数行从左到右传播,偶数行从右到左传播。</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: 18pt"><SPAN 
style="FONT-FAMILY: 宋体">在讲图案化技术时,我突然想到了一个非常有趣的应用,那就是</SPAN><SPAN 
lang=EN-US>bmp2txt</SPAN><SPAN style="FONT-FAMILY: 宋体">。如果你喜欢上</SPAN><SPAN 
lang=EN-US>BBS(</SPAN><SPAN style="FONT-FAMILY: 宋体">电子公告牌系统</SPAN><SPAN 
lang=EN-US>)</SPAN><SPAN 
style="FONT-FAMILY: 宋体">,你可能想做一个花哨的签名档。瞧,这是我好朋友</SPAN><SPAN 
lang=EN-US>Casper</SPAN><SPAN style="FONT-FAMILY: 宋体">的签名档</SPAN><SPAN 
lang=EN-US>(</SPAN><SPAN style="FONT-FAMILY: 宋体">见图</SPAN><SPAN 
lang=EN-US>4.8)</SPAN><SPAN style="FONT-FAMILY: 宋体">,胖乎乎的,是不是特别可爱?</SPAN></P>
<P class=a style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US><IMG height=289 
src="第4章 图象的半影调和抖动技术.files/image016.jpg" width=360 v:shapes="_x0000_i1036"> 
</SPAN></P>
<P style="LINE-HEIGHT: 18pt; TEXT-ALIGN: center" align=center><B><SPAN 
style="FONT-FAMILY: 宋体">图</SPAN>4.8&nbsp;&nbsp;&nbsp;&nbsp; Casper</B><B><SPAN 
style="FONT-FAMILY: 宋体">的签名档</SPAN><SPAN lang=EN-US></SPAN></B></P>
<P style="LINE-HEIGHT: 18pt"><SPAN 
style="FONT-FAMILY: 宋体">你仔细观察一下,就会发现,这是一幅全部由字符组成的图,因为在</SPAN><SPAN 
lang=EN-US>BBS</SPAN><SPAN 
style="FONT-FAMILY: 宋体">中只能出现文本的东西。那么,这幅图是怎么做出来的呢?难道是自己一个字符一个字符拼出来的。当然不是了,有一种叫</SPAN><SPAN 
lang=EN-US>bmp2txt</SPAN><SPAN style="FONT-FAMILY: 宋体">的应用程序</SPAN><SPAN 
lang=EN-US>(2</SPAN><SPAN style="FONT-FAMILY: 宋体">的发音和“</SPAN><SPAN 
lang=EN-US>to</SPAN><SPAN style="FONT-FAMILY: 宋体">”一样,所以如此命名</SPAN><SPAN 
lang=EN-US>)</SPAN><SPAN 
style="FONT-FAMILY: 宋体">,能把位图文件转换成和图案很相似的字符文本。是不是觉得很神奇?其实原理很简单,用到了和图案化技术类似的思想:首先将位图分成同样大小的小块,求出每一块灰度的平均值,然后和每个字符的灰度做比较,找出最接近的那个字符,来代表这一小块图象。那么,怎么确定字符的灰度呢?做下面的实验就明白了。</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN style="FONT-FAMILY: 宋体">打开记事本</SPAN><SPAN 
lang=EN-US>(notepad)</SPAN><SPAN style="FONT-FAMILY: 宋体">,输入字符“</SPAN><SPAN 
lang=EN-US>1</SPAN><SPAN style="FONT-FAMILY: 宋体">”,选定该字符,使其反色。按</SPAN><SPAN 
lang=EN-US>Alt+PrintScreen</SPAN><SPAN 
style="FONT-FAMILY: 宋体">键拷贝窗口屏幕。打开画笔</SPAN><SPAN 
lang=EN-US>(paintbrush)</SPAN><SPAN 
style="FONT-FAMILY: 宋体">,粘贴;然后把图放到最大</SPAN><SPAN lang=EN-US>(</SPAN><SPAN 
style="FONT-FAMILY: 宋体">×</SPAN><SPAN lang=EN-US>8)</SPAN><SPAN 
style="FONT-FAMILY: 宋体">,打开“查看”→“缩放”</SPAN> <SPAN 
style="FONT-FAMILY: 宋体">→“显示网格”菜单,如图</SPAN><SPAN lang=EN-US>4.9</SPAN><SPAN 
style="FONT-FAMILY: 宋体">所示:</SPAN></P>
<P class=a style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US><IMG height=226 
src="第4章 图象的半影调和抖动技术.files/image018.jpg" width=231 v:shapes="_x0000_i1037"> 
</SPAN></P>
<P style="LINE-HEIGHT: 18pt; TEXT-ALIGN: center" align=center><B><SPAN 
style="FONT-FAMILY: 宋体">图</SPAN>4.9&nbsp;&nbsp;&nbsp;&nbsp; </B><B><SPAN 
style="FONT-FAMILY: 宋体">字符“</SPAN><SPAN lang=EN-US>1</SPAN></B><B><SPAN 
style="FONT-FAMILY: 宋体">”的灰度</SPAN><SPAN lang=EN-US></SPAN></B></P>
<P style="LINE-HEIGHT: 18pt"><SPAN style="FONT-FAMILY: 宋体">数数字符“</SPAN><SPAN 
lang=EN-US>1</SPAN><SPAN style="FONT-FAMILY: 宋体">”用了几个点?是</SPAN><SPAN 
lang=EN-US>22</SPAN><SPAN 
style="FONT-FAMILY: 宋体">个。我想你已经明白了,字符的灰度和它所占的黑色点数有关,点越少,灰度值越大,空格字符的灰度最大,为全白,因为它一个黑点也没有;而字符“</SPAN><SPAN 
lang=EN-US>W</SPAN><SPAN style="FONT-FAMILY: 宋体">”的灰度值就比较低了。每个字符的面积是</SPAN><SPAN 
lang=EN-US>8</SPAN><SPAN style="FONT-FAMILY: 宋体">×</SPAN><SPAN 
lang=EN-US>16(</SPAN><SPAN style="FONT-FAMILY: 宋体">宽×高</SPAN><SPAN 
lang=EN-US>)</SPAN><SPAN 
style="FONT-FAMILY: 宋体">,所以一个字符的灰度值可以用如下的公式计算</SPAN><SPAN 
lang=EN-US>(1-</SPAN><SPAN style="FONT-FAMILY: 宋体">所占的黑点数</SPAN><SPAN 
lang=EN-US>/(8</SPAN><SPAN style="FONT-FAMILY: 宋体">×</SPAN><SPAN 
lang=EN-US>16))</SPAN><SPAN style="FONT-FAMILY: 宋体">×</SPAN><SPAN 
lang=EN-US>255</SPAN><SPAN 
style="FONT-FAMILY: 宋体">。下面是可显示的字符,及对应的灰度,共有</SPAN><SPAN 
lang=EN-US>95</SPAN><SPAN style="FONT-FAMILY: 宋体">个。这可是我辛辛苦苦整理出来的呦!</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>static char ch[95]={</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>' ',</SPAN></P>
<P 
style="LINE-HEIGHT: 18pt"><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN>'`','1','2','3','4','5','6','7','8','9','0','-','=','\\',</P>
<P 
style="LINE-HEIGHT: 18pt"><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN>'q','w','e','r','t','y','u','i','o','p','[',']',</P>
<P 
style="LINE-HEIGHT: 18pt"><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN>'a','s','d','f','g','h','j','k','l',';','\'',</P>
<P 
style="LINE-HEIGHT: 18pt"><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN>'z','x','c','v','b','n','m',',','.','/',</P>
<P 
style="LINE-HEIGHT: 18pt"><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN>'~','!','@','#','$','%','^','&amp;','*','(',')','_','+','|',</P>
<P 
style="LINE-HEIGHT: 18pt"><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN>'Q','W','E','R','T','Y','U','I','O','P','{','}',</P>
<P 
style="LINE-HEIGHT: 18pt"><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN>'A','S','D','F','G','H','J','K','L',':','"',</P>
<P 
style="LINE-HEIGHT: 18pt"><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN>'Z','X','C','V','B','N','M','&lt;','&gt;','?'</P>
<P 
style="LINE-HEIGHT: 18pt"><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };</P>
<P style="LINE-HEIGHT: 18pt">static int&nbsp; gr[95]= {</P>
<P 
style="LINE-HEIGHT: 18pt"><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN>&nbsp;0,</P>
<P 
style="LINE-HEIGHT: 18pt"><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN>&nbsp;7,22,28,31,31,27,32,22,38,32,40, 6,12,20,38,32,26,20,24,40,</P>
<P style="LINE-HEIGHT: 18pt"><SPAN>&nbsp; 
</SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;29,24,28,38,32,32,26,22,34,24,44,33,32,32,24,16, 6,22,26,22,</P>
<P 
style="LINE-HEIGHT: 18pt"><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN>&nbsp;26,34,29,35,10, 6,20,14,22,47,42,34,40,10,35,21,22,22,16,14,</P>
<P 
style="LINE-HEIGHT: 18pt"><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN>&nbsp;26,40,39,29,38,22,28,36,22,36,30,22,22,36,26,36,25,34,38,24,</P>
<P 
style="LINE-HEIGHT: 18pt"><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN>&nbsp;36,22,12,12,26,30,30,34,39,42,41,18,18,22</P>
<P 
style="LINE-HEIGHT: 18pt"><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN>&nbsp;};</P>
<P style="LINE-HEIGHT: 18pt"><SPAN 
style="FONT-FAMILY: 宋体">下面的这段程序实现了</SPAN><SPAN lang=EN-

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -