- Visual C++源码
- Visual Basic源码
- C++ Builder源码
- Java源码
- Delphi源码
- C/C++源码
- PHP源码
- Perl源码
- Python源码
- Asm源码
- Pascal源码
- Borland C++源码
- Others源码
- SQL源码
- VBScript源码
- JavaScript源码
- ASP/ASPX源码
- C#源码
- Flash/ActionScript源码
- matlab源码
- PowerBuilder源码
- LabView源码
- Flex源码
- MathCAD源码
- VBA源码
- IDL源码
- Lisp/Scheme源码
- VHDL源码
- Objective-C源码
- Fortran源码
- tcl/tk源码
- QT源码
myfile2.cpp
资源名称:myfile2.rar [点击查看]
上传用户:gtl089a
上传日期:2013-09-05
资源大小:5k
文件大小:21k
源码类别:
图形图像处理
开发平台:
Visual C++
- #include "stdafx.h"
- #include <math.h>
- #include <io.h>
- #include <direct.h>
- #include "dibapi.h"
- #include <complex>
- #define DIB_HEADER_MARKER ((WORD) ('M' << 8) | 'B')
- /////////////////////////////////////////////////////////////////////////////////////
- // DXF.2003.10.20
- // myfile2.cpp
- //
- // HGLOBAL WINAPI ZoomPixelreplication(HDIB hDib,unsigned char ** PixelData,
- // float hzoom,float vzoom)
- // 利用像素复制放大缩小图像
- // HGLOBAL WINAPI ZoomBilinear(HDIB hDib,unsigned char ** PixelData,
- // float hzoom,float vzoom)
- // 双线形插值放大缩小图像
- // BOOL WINAPI GrayReduce(HDIB hDib,unsigned char ** PixelData,long GrayLevel)
- // 图像gray的衰减
- // BOOL WINAPI Reverse(HDIB hDib,unsigned char ** PixelData)
- // 灰度图像的反色处理
- // BOOL WINAPI TransHalftone(HDIB hDib,unsigned char ** PixelData)
- // 图像的halftone处理
- // BOOL WINAPI ArithmeticOpr (HDIB hDib,unsigned char ** PixelData,
- // unsigned char ** PixelData2,const CString Opr,
- // const int width,const int height,const double scale,const double factor)
- // 图像的算数处理
- // BOOL WINAPI TransBw(HDIB hDib,unsigned char ** PixelData);
- // 生成黑白图
- /////////////////////////////////////////////////////////////////////////////////////
- /*///////////////////////////////////////////////////////////////////////////
- // HGLOBAL WINAPI ZoomPixelreplication(HDIB hDib,unsigned char ** PixelData,
- // float hzoom,float vzoom)
- // 利用像素复制放大缩小图像
- * 参数:
- * HDIB hDib - 指向源DIB图像句柄
- * unsigned char ** PixelData 像素数组
- * float hzoom 水平缩放率
- * float vzoom 垂直缩放率
- * 返回值:
- * HGLOBALL - 运算成功返回缩放后的图像句柄,否则返回NULL。
- //////////////////////////////////////////////////////////////////////////*/
- HGLOBAL WINAPI ZoomPixelreplication(HDIB hDib,unsigned char ** PixelData,float hzoom,float vzoom)
- {
- LPBITMAPINFOHEADER lpBi;
- lpBi=(LPBITMAPINFOHEADER)::GlobalLock((HGLOBAL) hDib);
- // 缩放后新DIB句柄
- HDIB hNewDIB;
- // 缩放后图像的宽度和高度
- LONG lNewWidth=0,lNewHeight=0, lrgb,lNewLineBytes,ltruebit;
- // 指向缩放图像的指针
- LPSTR lpNewDIB;
- unsigned char * hNewData;
- LPBITMAPINFOHEADER lpbmi;
- // 循环变量(象素在新DIB中的坐标)
- LONG i,j,i0,j0,len;
- AfxGetApp()->BeginWaitCursor();
- // 计算缩放后的图像实际宽度
- lNewWidth = (LONG) (lpBi->biWidth*hzoom);
- if (8==lpBi->biBitCount) len=1;
- if (24==lpBi->biBitCount) len=3;
- // 计算新图像每行的字节数
- lNewLineBytes = WIDTHBYTES(lNewWidth * 8 * len);
- // 计算缩放后的图像高度
- lNewHeight = (LONG) (lpBi->biHeight*vzoom);
- // 分配内存,以保存新DIB
- hNewDIB = (HDIB) ::GlobalAlloc(GHND, lNewLineBytes * lNewHeight + *(LPDWORD)(lpBi) +
- ::PaletteSize((LPSTR)lpBi));
- // 判断是否内存分配失败
- if (hNewDIB == NULL)// 分配内存失败
- return NULL;
- // 锁定内存
- lpNewDIB = (char * )::GlobalLock((HGLOBAL) hNewDIB);
- // 复制DIB信息头和调色板
- memcpy(lpNewDIB, (LPSTR)lpBi, *(LPDWORD)(lpBi) + ::PaletteSize((LPSTR)lpBi));
- // 找到新DIB象素起始位置
- hNewData = (unsigned char*)::FindDIBBits(lpNewDIB);
- // 获取指针
- lpbmi = (LPBITMAPINFOHEADER)lpNewDIB;
- // 更新DIB中图像的高度和宽度
- lpbmi->biWidth = lNewWidth;
- lpbmi->biHeight = lNewHeight;
- for (lrgb=0;lrgb<len;lrgb++)
- // 针对图像每行进行操作
- for(i = 0; i < lNewHeight; i++)
- {
- // 针对图像每列进行操作
- for(j = 0; j < lNewWidth; j++)
- {
- i0 = (LONG) (i / vzoom );
- j0 = (LONG) (j / hzoom );
- ltruebit=j0*len+lrgb;
- // 判断是否在源图范围内
- if( (j0 >= 0) && (j0 < lpBi->biWidth) && (i0 >= 0) && (i0 < lpBi->biHeight))
- {
- // 为像素赋值
- *(hNewData+lNewLineBytes* i + j*len+lrgb) = PixelData[i0][ltruebit];
- }
- else
- { // 对于源图中没有的像素,直接赋值为255
- *(hNewData+lNewLineBytes* i + j*len+lrgb) = 255;
- }
- }
- }
- AfxGetApp()->EndWaitCursor();
- ::GlobalUnlock((HGLOBAL)hDib);
- // 返回
- return hNewDIB;
- }
- /*///////////////////////////////////////////////////////////////////////////
- // HGLOBAL WINAPI ZoomBilinear(HDIB hDib,unsigned char ** PixelData,
- // float hzoom,float vzoom)
- // 双线形插值放大缩小图像
- * 参数:
- * HDIB hDib - 指向源DIB图像句柄
- * unsigned char ** PixelData 像素数组
- * float hzoom 水平缩放率
- * float vzoom 垂直缩放率
- * 返回值:
- * HGLOBALL - 运算成功返回缩放后的图像句柄,否则返回NULL。
- //////////////////////////////////////////////////////////////////////////*/
- HGLOBAL WINAPI ZoomBilinear(HDIB hDib,unsigned char ** PixelData,float hzoom,float vzoom){
- LPBITMAPINFOHEADER lpBi;
- lpBi=(LPBITMAPINFOHEADER)::GlobalLock((HGLOBAL) hDib);
- // 缩放后新DIB句柄
- HDIB hNewDIB;
- // 缩放后图像的宽度和高度
- LONG lNewWidth=0,lNewHeight=0, lNewLineBytes;
- // 缩放后图像的宽度(lNewWidth',必须是4的倍数)
- // 指向缩放图像的指针
- LPSTR lpNewDIB;
- unsigned char * hNewData;
- // 指向BITMAPINFO结构的指针(Win3.0)
- LPBITMAPINFOHEADER lpbmi;
- // 循环变量(象素在新DIB中的坐标)
- LONG i,j,i0,j0,l1,l2,i2,j2;
- float i1,j1;
- AfxGetApp()->BeginWaitCursor();
- // 计算缩放后的图像实际宽度
- lNewWidth = (LONG) (lpBi->biWidth*hzoom);
- // 计算新图像每行的字节数
- lNewLineBytes = WIDTHBYTES(lNewWidth * 8);
- // 计算缩放后的图像高度
- lNewHeight = (LONG) (lpBi->biHeight*vzoom);
- // 分配内存,以保存新DIB
- hNewDIB = (HDIB) ::GlobalAlloc(GHND, lNewLineBytes * lNewHeight + *(LPDWORD)(lpBi) +
- ::PaletteSize((LPSTR)lpBi));
- // 判断是否内存分配失败
- if (hNewDIB == NULL)// 分配内存失败
- return NULL;
- // 锁定内存
- lpNewDIB = (char * )::GlobalLock((HGLOBAL) hNewDIB);
- // 复制DIB信息头和调色板
- memcpy(lpNewDIB, (LPSTR)lpBi, *(LPDWORD)(lpBi) + ::PaletteSize((LPSTR)lpBi));
- // 找到新DIB象素起始位置
- hNewData = (unsigned char*)::FindDIBBits(lpNewDIB);
- // 获取指针
- lpbmi = (LPBITMAPINFOHEADER)lpNewDIB;
- // 更新DIB中图像的高度和宽度
- lpbmi->biWidth = lNewWidth;
- lpbmi->biHeight = lNewHeight;
- //已知a,b,c,d四点的灰度,要求e点的灰度,
- //可以先在水平方向上由a,b线形插值求出g,c,d线形插值求出f,
- //然后在垂直方向上由g,f线形插值求出e 线形插值是基于这样的假设,
- //即原图的灰度在两个像素之间是线形变化的,一般情况下,
- //这种插值的效果还不错。更精确的方法是采用曲线插值(Curvilinear Interpolation),
- //即认为像素之间的灰度变化规律符合某种曲线,但这种处理的计算量是很大的。
- // 针对图像每行进行操作
- for(i = 0; i < lNewHeight; i++)
- {
- // 针对图像每列进行操作
- for(j = 0; j < lNewWidth; j++)
- {
- i0 = (LONG) (i / vzoom );
- j0 = (LONG) (j / hzoom );
- i1 = i / vzoom ;
- j1 = j / hzoom ;
- // 判断是否在源图范围内
- if ((i0==i1)&&(j0==j1))
- *(hNewData+lNewLineBytes* i + j) = PixelData[i0][j0];
- else
- {
- i2 = (LONG) (i / vzoom +0.5);
- j2 = (LONG) (j / hzoom +0.5);
- if (i2==lpBi->biHeight) i2=lpBi->biHeight-1;
- if (j2==lpBi->biWidth) j2=lpBi->biWidth-1;
- //f(x1)=(f(x2)-f(x0))*(x1-x0)/(x2-x0)+f(x0);
- l1 = (PixelData[i0][j2]-PixelData[i0][j0])*(j1-j0)/(j2-j0)+PixelData[i0][j0];
- l2 = (PixelData[i2][j2]-PixelData[i2][j0])*(j1-j0)/(j2-j0)+PixelData[i2][j0];
- if ( (i2!=i0) && (j0!=j2) )
- l1 = (l2-l1)*(i1-i0)/(i2-i0)+l1;
- else
- l1=PixelData[i0][j0];
- *(hNewData+lNewLineBytes* i + j) = l1;
- }
- }
- }
- ::GlobalUnlock((HGLOBAL)hDib);
- AfxGetApp()->EndWaitCursor();
- // 返回
- return hNewDIB;
- }
- //////////////////////////////////////////////////////////////////////
- //limb算法,生成二维数组
- ////////////////////////////////////////////////////////////////////
- BYTE **limb(int Level)
- {
- int i,j, i0,i1;
- BYTE ** gray;
- BYTE ** graytmp;
- i0 = pow(2,Level);
- gray = new BYTE*[i0];
- //初始化数组
- for (i=0;i<i0;i++)
- gray[i] = new BYTE[i0];
- //BYTE gray1[2][2]={{0,2},{3,1}};
- if (1==Level)
- {
- gray[0][0]=0;
- gray[0][1]=2;
- gray[1][0]=3;
- gray[1][1]=1;
- }
- else
- {
- ////////////////////////////////////////////////////////////////////
- //根据limb算法生成gray数组
- ////////////////////////////////////////////////////////////////////
- i1 = pow(2,Level-1);
- graytmp = new BYTE*[i1];
- //初始化数组
- for (i=0;i<i1;i++)
- graytmp[i] = new BYTE[i1];
- graytmp = limb(Level-1);
- for(i=0;i<i1;i++)
- for (j=0;j<i1;j++)
- gray[i][j] = 4*graytmp[i][j];
- for(i=0;i<i1;i++)
- for (j=i1;j<i0;j++)
- gray[i][j] = 4*graytmp[i][j-i1]+2;
- for(i=i1;i<i0;i++)
- for (j=0;j<i1;j++)
- gray[i][j] = 4*graytmp[i-i1][j]+3;
- for(i=i1;i<i0;i++)
- for (j=i1;j<i0;j++)
- gray[i][j] = 4*graytmp[i-i1][j-i1]+1;
- }
- return gray;
- }
- /////////////////////////////////////////////////////////////////////
- //图像gray的衰减,
- //////////////////////////////////////////////////////////////////////
- BOOL WINAPI GrayReduce0(HDIB hDib,unsigned char ** PixelData,long GrayLevel)
- {
- /* LPBITMAPINFOHEADER lpBi;
- unsigned char * hData;
- lpBi=(LPBITMAPINFOHEADER)GlobalLock((HGLOBAL)hDib);
- hData=(unsigned char*)FindDIBBits((LPSTR)lpBi);
- int i,j, i0,tmp;
- BYTE * gray;
- i0 = pow(2,GrayLevel);
- gray = new BYTE[i0];
- i0--;
- ////////////////////////////////////////////////////////////////////
- //根据limb算法生成gray数组
- ////////////////////////////////////////////////////////////////////
- for (i=0;i<i0;i++)
- gray[i]=0;
- tmp = 8- GrayLevel;
- for(i=0; i<lpBi->biHeight; i++)
- for(j=0; j<lpBi->biWidth; j++) {
- ////////////////////////////////////////////////////////
- if ( (PixelData[i][j]>>tmp) >
- gray[i&i0][j&i0]) //右移后做比较
- *(hData+WIDTHBYTES(lpBi->biWidth*8)*i+j) = (unsigned char)255;
- else
- *(hData+WIDTHBYTES(lpBi->biWidth*8)*i+j) = (unsigned char)0;
- //根据算法得出结果,写回
- }
- ::GlobalUnlock((HGLOBAL)hDib);
- i0 = pow(2,GrayLevel);
- for(i = 0; i <i0 ; i++)
- delete [] gray[i];
- delete [] gray;
- ::GlobalUnlock((HGLOBAL)hDib);*/
- // 返回
- return true;
- }
- /*///////////////////////////////////////////////////////////////////////////
- // BOOL WINAPI GrayReduce(HDIB hDib,unsigned char ** PixelData,long GrayLevel)
- // 图像gray的衰减
- * 参数:
- * HDIB hDib - 指向源DIB图像句柄
- * unsigned char ** PixelData 像素数组
- * long GrayLevel 灰度的值=2^GrayLevel
- * 返回值:
- * BOOL - 运算成功返回TRUE,否则返回FALSE。
- //////////////////////////////////////////////////////////////////////////*/
- BOOL WINAPI GrayReduce(HDIB hDib,unsigned char ** PixelData,long GrayLevel)
- {
- LPBITMAPINFOHEADER lpBi;
- unsigned char * hData;
- lpBi=(LPBITMAPINFOHEADER)GlobalLock((HGLOBAL)hDib);
- hData=(unsigned char*)FindDIBBits((LPSTR)lpBi);
- long i,j, i0,tmp,lLineBytes;
- lLineBytes = WIDTHBYTES(lpBi->biWidth*8);
- BYTE ** gray;
- i0 = pow(2,GrayLevel)-1;
- ////////////////////////////////////////////////////////////////////
- //根据limb算法生成gray数组
- ////////////////////////////////////////////////////////////////////
- gray = limb(GrayLevel);
- tmp = 8- (GrayLevel*2);
- for(i=0; i<lpBi->biHeight; i++)
- for(j=0; j<lpBi->biWidth; j++) {
- ////////////////////////////////////////////////////////
- if ( (PixelData[i][j]>>tmp) >
- gray[i&i0][j&i0]) //右移后做比较
- *(hData+lLineBytes*i+j) = (unsigned char)255;
- else
- *(hData+lLineBytes*i+j) = (unsigned char)0;
- //根据算法得出结果,写回
- }
- ::GlobalUnlock((HGLOBAL)hDib);
- i0 = pow(2,GrayLevel);
- for(i = 0; i <i0 ; i++)
- delete [] gray[i];
- delete [] gray;
- ::GlobalUnlock((HGLOBAL)hDib);
- // 返回
- return true;
- }
- /*///////////////////////////////////////////////////////////////////////////
- // BOOL WINAPI Reverse(HDIB hDib,unsigned char ** PixelData)
- // //灰度图像的反色处理
- * 参数:
- * HDIB hDib - 指向源DIB图像句柄
- * unsigned char ** PixelData 像素数组
- * 返回值:
- * BOOL - 运算成功返回TRUE,否则返回FALSE。
- //////////////////////////////////////////////////////////////////////////*/
- BOOL WINAPI Reverse(HDIB hDib,unsigned char ** PixelData)
- {
- LPBITMAPINFOHEADER lpBi;
- unsigned char * hData;
- lpBi=(LPBITMAPINFOHEADER)GlobalLock((HGLOBAL)hDib);
- hData=(unsigned char*)FindDIBBits((LPSTR)lpBi);
- long i,j,lLineBytes,k;
- if (lpBi->biBitCount==8) k=1;
- if (lpBi->biBitCount==24) k=3;
- lLineBytes = WIDTHBYTES(lpBi->biWidth*8*k);
- for(i=0; i<lpBi->biHeight; i++)
- for(j=0; j<lpBi->biWidth*k; j++) {
- *(hData+lLineBytes*i+j)=
- (unsigned char)(255-PixelData[i][j]);//根据算法得出结果,写回
- }
- ::GlobalUnlock((HGLOBAL)hDib);
- return true;
- }
- /*///////////////////////////////////////////////////////////////////////////
- // BOOL WINAPI TransHalftone(HDIB hDib,unsigned char ** PixelData)
- // 图像的halftone处理
- * 参数:
- * HDIB hDib - 指向源DIB图像句柄
- * unsigned char ** PixelData 像素数组
- * 返回值:
- * BOOL - 运算成功返回TRUE,否则返回FALSE。
- //////////////////////////////////////////////////////////////////////////*/
- BOOL WINAPI TransHalftone (HDIB hDib,unsigned char ** PixelData)
- {
- static int gr[3][3]= {{84,28,140},{224,252,168},{112,196,56}};
- LPBITMAPINFOHEADER lpZoomOutBi,lpBi;
- unsigned char * hData;
- unsigned char * hZoomOutData;
- unsigned char tmp;
- int lZoomOutLineBytes, lLineBytes;
- lpBi=(LPBITMAPINFOHEADER)GlobalLock((HGLOBAL)hDib);
- hData=(unsigned char*)FindDIBBits((LPSTR)lpBi);
- lLineBytes = WIDTHBYTES(lpBi->biWidth*8);
- HDIB hZoomOutDib;
- //首先缩小图像宽与高的1/3
- hZoomOutDib=(HDIB)ZoomPixelreplication(hDib,PixelData,(float)0.33,(float)0.33);
- lpZoomOutBi=(LPBITMAPINFOHEADER)GlobalLock((HGLOBAL)hZoomOutDib);
- hZoomOutData=(unsigned char*)FindDIBBits((LPSTR)lpZoomOutBi);
- lZoomOutLineBytes=WIDTHBYTES(lpZoomOutBi->biWidth*8);
- int i,j,i0,j0,ll=0;
- //每个像素对应9个新点
- for(i=0; i<lpZoomOutBi->biHeight; i++)
- for(j=0; j<lpZoomOutBi->biWidth; j++)
- {
- tmp = *(hZoomOutData+i*lZoomOutLineBytes+j);
- for (i0=0;i0<3;i0++)
- for(j0=0;j0<3;j0++)
- if (tmp>=gr[i0][j0])
- *(hData+lLineBytes*(i*3+i0)+j*3+j0)=255;
- else
- *(hData+lLineBytes*(i*3+i0)+j*3+j0)=0;
- }
- ::GlobalUnlock((HGLOBAL)hZoomOutDib);
- ::GlobalFree((HGLOBAL)hZoomOutDib);
- ::GlobalUnlock((HGLOBAL)hDib);
- return true;
- }
- /////////////////////////////////////////////////////////////////////
- //将24位的彩色图转为8位灰度图
- /////////////////////////////////////////////////////////////////////
- BOOL WINAPI Bmp2256 (HDIB hDib,unsigned char ** PixelData,const CString FileName1)
- {
- CFile file;
- CFileException fileException;
- LPBITMAPINFOHEADER lpOldBi;
- BITMAPINFOHEADER bi;
- BITMAPFILEHEADER bh;
- RGBQUAD lrgb[256];
- HLOCAL hNewDIBBits;
- LPSTR lpSrc,lpDst,lpNewDIBBits;
- unsigned char lGray;
- long lWidth,lHeight, lSize,lLineBytes;
- // 循环变量(象素在新DIB中的坐标)
- LONG i,j,j0;
- AfxGetApp()->BeginWaitCursor();
- if (!file.Open(FileName1, CFile::modeCreate |
- CFile::modeReadWrite | CFile::shareExclusive, &fileException))
- return FALSE;
- lpSrc = (LPSTR)::GlobalLock((HGLOBAL) hDib);
- lpOldBi=(LPBITMAPINFOHEADER)lpSrc;
- lWidth = lpOldBi->biWidth;
- lHeight = lpOldBi->biHeight;
- // 计算新图像每行的字节数
- lLineBytes = WIDTHBYTES(lWidth * 8 );
- // 分配内存,以保存新DIB
- lSize = lLineBytes * lHeight;
- //更新文件头
- bh.bfType = DIB_HEADER_MARKER;;
- bh.bfSize = lSize+sizeof(bh)+sizeof(bi)+
- 256*sizeof(RGBQUAD);
- bh.bfReserved1=0;
- bh.bfReserved2=0;
- bh.bfOffBits = sizeof(bh)+sizeof(bi)+256*sizeof(RGBQUAD);
- file.Write(&bh,14);
- // 文件信息头
- bi.biWidth = lWidth;
- bi.biHeight = lHeight;
- bi.biBitCount=8;
- bi.biSizeImage = lLineBytes * lHeight;
- bi.biClrImportant=0;
- bi.biClrUsed=0;
- bi.biCompression=0;
- bi.biPlanes=1;
- bi.biSize=40;
- file.Write(&bi,40);
- ::GlobalUnlock((HGLOBAL)hDib);
- // 计算灰度映射表(保存各个颜色的灰度值),并更新DIB调色板
- for (i = 0; i < 256; i ++)
- {
- // 计算该颜色对应的灰度值
- lrgb[i].rgbRed = i;
- lrgb[i].rgbGreen = i;
- lrgb[i].rgbBlue = i;
- lrgb[i].rgbReserved = 0;
- file.Write(&lrgb[i],sizeof(RGBQUAD));
- }
- hNewDIBBits = LocalAlloc(LHND, lSize);
- if (hNewDIBBits == NULL)
- // 分配内存失败
- return FALSE;
- // 锁定内存
- lpNewDIBBits = (char * )LocalLock(hNewDIBBits);
- // 初始化新分配的内存,设定初始值为255
- lpDst = (char *)lpNewDIBBits;
- memset(lpDst, (BYTE)255, lSize);
- // 针对图像每行进行操作
- for(i = 0; i < lHeight; i++)
- // 针对图像每列进行操作
- for(j = 0; j < lWidth; j++)
- // 为像素赋值
- {
- j0 = j*3;
- lGray =(299*PixelData[i][j0] +
- 587*PixelData[i][j0+1] +
- 114*PixelData[i][j0+2])/1000;
- *(lpDst+lLineBytes* i + j) = (unsigned char)lGray;
- }
- file.Write(lpDst,lSize);
- file.Close();
- // 释放内存
- LocalUnlock(hNewDIBBits);
- LocalFree(hNewDIBBits);
- AfxGetApp()->EndWaitCursor();
- return true;
- }
- /*///////////////////////////////////////////////////////////////////////////
- // BOOL WINAPI ArithmeticOpr (HDIB hDib,unsigned char ** PixelData,
- // unsigned char ** PixelData2,const CString Opr,
- // const int width,const int height,const double scale,const double factor)
- // 图像的算数处理
- * 参数:
- * HDIB hDib - 指向源DIB图像句柄
- * unsigned char ** PixelData BK像素数组
- * unsigned char ** PixelData2 前景像素数组
- * const CString Opr, 算术操作符号
- * const int width, 要处理的图像宽度
- * const int height, 要处理的图像高度
- * const double scale 加减时为scale
- * 加减(source1+source2)/scale+offset
- * const double factor 乘法时为 乘法的乘数,加减时为offset
- * 返回值:
- * BOOL - 运算成功返回TRUE,否则返回FALSE。
- //////////////////////////////////////////////////////////////////////////*/
- BOOL WINAPI ArithmeticOpr (HDIB hDib,unsigned char ** PixelData,
- unsigned char ** PixelData2,const CString Opr,
- const int width,const int height,const double scale,
- const double factor)
- {
- LPBITMAPINFOHEADER lpBi;
- unsigned char * hData;
- long lLineBytes,len,lrgb,ltruebit;
- lpBi=(LPBITMAPINFOHEADER)GlobalLock((HGLOBAL)hDib);
- hData=(unsigned char*)FindDIBBits((LPSTR)lpBi);
- if (8==lpBi->biBitCount) len=1;
- if (24==lpBi->biBitCount) len=3;
- lLineBytes = WIDTHBYTES(lpBi->biWidth*8*len);
- int i,j;
- float tmp;
- for (lrgb=0;lrgb<3;lrgb++)
- for(i=0; i<height; i++)
- for(j=0; j<width; j++)
- {
- ltruebit=j*len+lrgb;
- if (Opr=="*")
- tmp = PixelData[i][ltruebit]*factor;
- if (Opr=="+")
- tmp = (PixelData[i][ltruebit]+PixelData2[i][ltruebit])/scale+factor;
- if (Opr=="-")
- tmp = (PixelData[i][ltruebit]-PixelData2[i][ltruebit])/scale+factor;
- if (tmp>255) tmp=255;
- if (tmp<0) tmp=0;
- *(hData+lLineBytes*i+ltruebit)=tmp;
- }
- // delete PixelData2;
- ::GlobalUnlock((HGLOBAL)hDib);
- return true;
- }
- /*///////////////////////////////////////////////////////////////////////////
- // BOOL WINAPI TransBw(HDIB hDib,unsigned char ** PixelData)
- // 生成黑白间隔图
- * 参数:
- * HDIB hDib - 指向源DIB图像句柄
- * unsigned char ** PixelData 像素数组
- * 返回值:
- * BOOL - 运算成功返回TRUE,否则返回FALSE。
- //////////////////////////////////////////////////////////////////////////*/
- HGLOBAL WINAPI TransBw(HDIB hDib)
- {
- LPBITMAPINFOHEADER lpBi;
- unsigned char * hData;
- lpBi=(LPBITMAPINFOHEADER)GlobalLock((HGLOBAL)hDib);
- hData=(unsigned char*)FindDIBBits((LPSTR)lpBi);
- int i,j;
- // 新DIB句柄
- HDIB hNewDIB;
- // 缩放后图像的宽度和高度
- LONG lNewWidth=0,lNewHeight=0, lNewLineBytes;
- // 图像的宽度(lNewWidth',必须是4的倍数)
- // 指向缩放图像的指针
- LPSTR lpNewDIB;
- unsigned char * hNewData;
- // 指向BITMAPINFO结构的指针(Win3.0)
- LPBITMAPINFOHEADER lpbmi;
- // 循环变量(象素在新DIB中的坐标)
- AfxGetApp()->BeginWaitCursor();
- // 计算缩放后的图像实际宽度
- lNewWidth = 256;
- // 计算新图像每行的字节数
- lNewLineBytes = WIDTHBYTES(lNewWidth * 8);
- // 计算缩放后的图像高度
- lNewHeight = 256;
- // 分配内存,以保存新DIB
- hNewDIB = (HDIB) ::GlobalAlloc(GHND, lNewLineBytes * lNewHeight + *(LPDWORD)(lpBi) +
- ::PaletteSize((LPSTR)lpBi));
- // 判断是否内存分配失败
- if (hNewDIB == NULL)// 分配内存失败
- return NULL;
- // 锁定内存
- lpNewDIB = (char * )::GlobalLock((HGLOBAL) hNewDIB);
- // 复制DIB信息头和调色板
- memcpy(lpNewDIB, (LPSTR)lpBi, *(LPDWORD)(lpBi) + ::PaletteSize((LPSTR)lpBi));
- ::GlobalUnlock((HGLOBAL)hDib);
- // 找到新DIB象素起始位置
- hNewData = (unsigned char*)::FindDIBBits(lpNewDIB);
- // 获取指针
- lpbmi = (LPBITMAPINFOHEADER)lpNewDIB;
- // 更新DIB中图像的高度和宽度
- lpbmi->biWidth = lNewWidth;
- lpbmi->biHeight = lNewHeight;
- for(i=0; i<lNewWidth; i++)
- for(j=0; j<lNewHeight; j++)
- {
- if (div(i,2).rem==0)
- *(hNewData+lNewLineBytes*j+i)=(unsigned char)(0);
- else
- *(hNewData+lNewLineBytes*j+i)=(unsigned char)(255);
- //根据算法得出结果,写回
- }
- AfxGetApp()->EndWaitCursor();
- // 返回
- return hNewDIB;
- }