正在加载图片...
图47利用 Floyd-Steinberg算法抖动生成的图 下面我们给出 Floyd- Steinberg算法的源代码。有一点要说明,我们原来介绍的程序都是先开 一个char类型的缓冲区,用来存储新图数据,但在这个算法中,因为e有可能是负数,为 了防止得到的值超岀char能表示的范围,我们使用了一个int类型的缓冲区存储新值。另外, 当按从左到右,从上到下的顺序处理象素时,处理过的象素以后不会再用到了,所以用这个 int类型的缓冲区存储新值是可行的。全部象素处理完后,再将这些值拷贝到char类型的缓 冲区去。 BOOL Steinberg(HWND hWnd) OffBits. BufSize Int BufSize LPBITMAPINFOHEADER lplmg Data HLOCAL hTemplmg Data LPBITMAPINFOHEADER lp Templmg Data LPSTR IpPt LPSTR Ip TempPtr HDC HFILE LONG HLOCAL hInt: *lplnt Buf, *lpIntPtr; OffBits为 BITMAPINFOHEADER结构长度加调色板的大小 OffBitsbf. bfoffBits-sizeof( BITMAPFILEHEADER) Bufsize= OffBits+bi. biHeight*Line Bytes,要开的缓冲区的大小 if((hTemplmg DataLocalAlloc(LHND, BufSize))==NULL)图 4.7 利用 Floyd-Steinberg 算法抖动生成的图 下面我们给出 Floyd-Steinberg 算法的源代码。有一点要说明,我们原来介绍的程序都是先开 一个 char 类型的缓冲区,用来存储新图数据,但在这个算法中,因为 e 有可能是负数,为 了防止得到的值超出 char 能表示的范围,我们使用了一个 int 类型的缓冲区存储新值。另外, 当按从左到右,从上到下的顺序处理象素时,处理过的象素以后不会再用到了,所以用这个 int 类型的缓冲区存储新值是可行的。全部象素处理完后,再将这些值拷贝到 char 类型的缓 冲区去。 BOOL Steinberg(HWND hWnd) { DWORD OffBits,BufSize,IntBufSize; LPBITMAPINFOHEADER lpImgData; HLOCAL hTempImgData; LPBITMAPINFOHEADER lpTempImgData; LPSTR lpPtr; LPSTR lpTempPtr; HDC hDc; HFILE hf; LONG x,y; unsigned char num; float e,f; HLOCAL hIntBuf; int *lpIntBuf,*lpIntPtr; int tempnum; //OffBits 为 BITMAPINFOHEADER 结构长度加调色板的大小 OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER); BufSize=OffBits+bi.biHeight*LineBytes;//要开的缓冲区的大小 if((hTempImgData=LocalAlloc(LHND,BufSize))==NULL)
<<向上翻页向下翻页>>
©2008-现在 cucdc.com 高等教育资讯网 版权所有