📄 第4章 图象的半影调和抖动技术.htm
字号:
<P
style="LINE-HEIGHT: 18pt">DWORD
OffBits,BufSize,IntBufSize;</P>
<P style="LINE-HEIGHT: 18pt">LPBITMAPINFOHEADER lpImgData;</P>
<P
style="LINE-HEIGHT: 18pt">HLOCAL
hTempImgData;</P>
<P style="LINE-HEIGHT: 18pt">LPBITMAPINFOHEADER lpTempImgData;</P>
<P
style="LINE-HEIGHT: 18pt">LPSTR
lpPtr;</P>
<P
style="LINE-HEIGHT: 18pt">LPSTR
lpTempPtr;</P>
<P
style="LINE-HEIGHT: 18pt">HDC
hDc;</P>
<P
style="LINE-HEIGHT: 18pt">HFILE
hf;</P>
<P
style="LINE-HEIGHT: 18pt">LONG
x,y;</P>
<P style="LINE-HEIGHT: 18pt">unsigned
char
num;</P>
<P
style="LINE-HEIGHT: 18pt">float
e,f;</P>
<P
style="LINE-HEIGHT: 18pt">HLOCAL
hIntBuf;</P>
<P
style="LINE-HEIGHT: 18pt">int
*lpIntBuf,*lpIntPtr;</P>
<P
style="LINE-HEIGHT: 18pt">int
tempnum;</P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>//OffBits</SPAN><SPAN
style="FONT-FAMILY: 宋体">为</SPAN><SPAN lang=EN-US>BITMAPINFOHEADER</SPAN><SPAN
style="FONT-FAMILY: 宋体">结构长度加调色板的大小</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN
lang=EN-US>OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN
lang=EN-US>BufSize=OffBits+bi.biHeight*LineBytes;//</SPAN><SPAN
style="FONT-FAMILY: 宋体">要开的缓冲区的大小</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN
lang=EN-US>if((hTempImgData=LocalAlloc(LHND,BufSize))==NULL)</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>{</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>MessageBox(hWnd,"Error alloc
memory!","Error Message",MB_OK|</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>MB_ICONEXCLAMATION);</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>return FALSE;</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>}</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN
lang=EN-US>IntBufSize=(DWORD)bi.biHeight*LineBytes*sizeof(int);
if((hIntBuf=LocalAlloc(LHND,IntBufSize))==NULL) //int </SPAN><SPAN
style="FONT-FAMILY: 宋体">类型的缓冲区</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>{</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>MessageBox(hWnd,"Error alloc
memory!","Error Message",MB_OK|</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>MB_ICONEXCLAMATION);</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN
lang=EN-US>LocalFree(hTempImgData);</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>return FALSE;</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>}</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN
lang=EN-US>lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN
lang=EN-US>lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData);</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>lpIntBuf=(int
*)LocalLock(hIntBuf);</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>memcpy(lpTempImgData,lpImgData,OffBits);</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>//</SPAN><SPAN
style="FONT-FAMILY: 宋体">将图象数据拷贝到</SPAN><SPAN lang=EN-US>int</SPAN><SPAN
style="FONT-FAMILY: 宋体">类型的缓冲区中</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN
lang=EN-US>for(y=0;y<bi.biHeight;y++){</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>lpPtr=(char
*)lpImgData+(BufSize-LineBytes-y*LineBytes);</SPAN></P>
<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<bi.biWidth;x++)</SPAN></P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>*(lpIntPtr++)=(unsigned char)*(lpPtr++);</P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>}</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN
lang=EN-US>for(y=0;y<bi.biHeight;y++){</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN
lang=EN-US>for(x=0;x<bi.biWidth;x++){</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>lpIntPtr=(int
*)lpIntBuf+(bi.biHeight-1-y)*LineBytes+x;</SPAN></P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>num=(unsigned char)*lpIntPtr;</P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>if ( num > 128 ){ //128<SPAN style="FONT-FAMILY: 宋体">是中值</SPAN></P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>*lpIntPtr=255; //<SPAN style="FONT-FAMILY: 宋体">打白点</SPAN></P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>e=(float)(num-255.0); //<SPAN style="FONT-FAMILY: 宋体">计算误差</SPAN></P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>}</P>
<P style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>else{</P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>*lpIntPtr=0; //<SPAN style="FONT-FAMILY: 宋体">打黑点</SPAN></P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>e=(float)num; //<SPAN style="FONT-FAMILY: 宋体">计算误差</SPAN></P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>}</P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>if(x<bi.biWidth-1){ //<SPAN style="FONT-FAMILY: 宋体">注意判断边界</SPAN></P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>f=(float)*(lpIntPtr+1);</P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>f+=(float)( (3.0/8.0) * e);</P>
<P style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN> *(lpIntPtr+1)=(int)f; //<SPAN
style="FONT-FAMILY: 宋体">向左传播</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>}</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>if(y<bi.biHeight-1){ //<SPAN style="FONT-FAMILY: 宋体">注意判断边界</SPAN></P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>f=(float)*(lpIntPtr-LineBytes);</P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>f+=(float)( (3.0/8.0) * e);</P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>*(lpIntPtr-LineBytes)=(int)f; //<SPAN
style="FONT-FAMILY: 宋体">向下传播</SPAN></P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>f=(float)*(lpIntPtr-LineBytes+1);</P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>f+=(float)( (1.0/4.0) * e);</P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>*(lpIntPtr-LineBytes+1)=(int)f; //<SPAN
style="FONT-FAMILY: 宋体">向右下传播</SPAN></P>
<P
style="LINE-HEIGHT: 18pt"><SPAN>
</SPAN>}</P>
<P style="LINE-HEIGHT: 18pt"><SPAN> </SPAN>}</P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>}</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>//</SPAN><SPAN
style="FONT-FAMILY: 宋体">从</SPAN><SPAN lang=EN-US>int</SPAN><SPAN
style="FONT-FAMILY: 宋体">类型的缓冲区拷贝到</SPAN><SPAN lang=EN-US>char</SPAN><SPAN
style="FONT-FAMILY: 宋体">类型的缓冲区</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN
lang=EN-US>for(y=0;y<bi.biHeight;y++){</SPAN></P>
<P style="LINE-HEIGHT: 18pt"><SPAN lang=EN-US>lpTempPtr=(char
*)lpTempImgData+(BufSize-LineBytes-y*LineBytes);</SPAN></P>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -