我在网上找到了c的代码,但由于本人能力有限,关于指针的代码转化不过来,请大虾帮我个忙。以下是代码:
BOOL TemplateOperation(HWND hWnd, int TemplateType){ DWORD OffBits,BufSize; LPBITMAPINFOHEADER lpImgData; LPSTR lpPtr; HLOCAL hTempImgData; LPBITMAPINFOHEADER lpTempImgData; LPSTR lpTempPtr; HDC hDc; HFILE hf; LONG x,y; float coef; //模板前面所乘的系数 int CoefArray[9]; //模板数组 float TempNum; char filename[80]; switch(TemplateType){ //判断模板类型 case TEMPLATE_SMOOTH_BOX: //Box平滑模板 coef=(float)(1.0/9.0); memcpy(CoefArray,Template_Smooth_Box,9*sizeof(int)); strcpy(filename,"c:\\smbox.bmp"); break; case TEMPLATE_SMOOTH_GAUSS: //高斯平滑模板 coef=(float)(1.0/16.0); memcpy(CoefArray,Template_Smooth_Gauss,9*sizeof(int)); strcpy(filename,"c:\\smgauss.bmp"); break; case TEMPLATE_SHARPEN_LAPLACIAN: //拉普拉斯锐化模板 coef=(float)1.0; memcpy(CoefArray,Template_Sharpen_Laplacian,9*sizeof(int)); strcpy(filename,"c:\\shlaplac.bmp"); break; } OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER); BufSize=OffBits+bi.biHeight*LineBytes; if((hTempImgData=LocalAlloc(LHND,BufSize))==NULL){ MessageBox(hWnd,"Error alloc memory!","Error Message",MB_OK|MB_ICONEXCLAMATION);return FALSE;} lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData); lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData); lpPtr=(char *)lpImgData; lpTempPtr=(char *)lpTempImgData;//先将原图直接拷贝过来,其实主要是拷贝周围一圈的象素 memcpy(lpTempPtr,lpPtr,BufSize); for(y=1;y<bi.biHeight-1;y++) //注意y的范围是从1到bi.biHeight-2 for(x=1;x<bi.biWidth-1;x++){ //注意x的范围是从1到bi.biWidth-2 lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes)+x; lpTempPtr=(char*)lpTempImgData+(BufSize-LineBytes-y*LineBytes)+x;TempNum=(float)((unsigned char)*(lpPtr+LineBytes-1))*CoefArray[0]; TempNum+=(float)((unsigned char)*(lpPtr+LineBytes))*CoefArray[1]; TempNum+=(float)((unsigned char)*(lpPtr+LineBytes+1))*CoefArray[2]; TempNum+=(float)((unsigned char)*(lpPtr-1))*CoefArray[3]; TempNum+=(float)((unsigned char)*lpPtr)*CoefArray[4]; TempNum+=(float)((unsigned char)*(lpPtr+1))*CoefArray[5]; TempNum+=(float)((unsigned char)*(lpPtr-LineBytes-1))*CoefArray[6]; TempNum+=(float)((unsigned char)*(lpPtr-LineBytes))*CoefArray[7]; TempNum+=(float)((unsigned char)*(lpPtr-LineBytes+1))*CoefArray[8]; //最后乘以系数TempNum*=coef; //注意对溢出点的处理 if(TempNum>255.0) *lpTempPtr=(BYTE)255; else if(TempNum<0.0) *lpTempPtr=(unsigned char)fabs(TempNum); else *lpTempPtr=(BYTE)TempNum; }hDc=GetDC(hWnd); if(hBitmap!=NULL) DeleteObject(hBitmap);hBitmap=CreateDIBitmap(hDc,(LPBITMAPINFOHEADER)lpTempImgData,(LONG)CBM_INIT,(LPSTR)lpTempImgData+sizeof(BITMAPINFOHEADER)+NumColors*sizeof(RGBQUAD),(LPBITMAPINFO)lpTempImgData,DIB_RGB_COLORS);hf=_lcreat(filename,0); _lwrite(hf,(LPSTR)&bf,sizeof(BITMAPFILEHEADER)); _lwrite(hf,(LPSTR)lpTempImgData,BufSize); _lclose(hf); ReleaseDC(hWnd,hDc); LocalUnlock(hTempImgData); LocalFree(hTempImgData); GlobalUnlock(hImgData); return TRUE;}
BOOL TemplateOperation(HWND hWnd, int TemplateType){ DWORD OffBits,BufSize; LPBITMAPINFOHEADER lpImgData; LPSTR lpPtr; HLOCAL hTempImgData; LPBITMAPINFOHEADER lpTempImgData; LPSTR lpTempPtr; HDC hDc; HFILE hf; LONG x,y; float coef; //模板前面所乘的系数 int CoefArray[9]; //模板数组 float TempNum; char filename[80]; switch(TemplateType){ //判断模板类型 case TEMPLATE_SMOOTH_BOX: //Box平滑模板 coef=(float)(1.0/9.0); memcpy(CoefArray,Template_Smooth_Box,9*sizeof(int)); strcpy(filename,"c:\\smbox.bmp"); break; case TEMPLATE_SMOOTH_GAUSS: //高斯平滑模板 coef=(float)(1.0/16.0); memcpy(CoefArray,Template_Smooth_Gauss,9*sizeof(int)); strcpy(filename,"c:\\smgauss.bmp"); break; case TEMPLATE_SHARPEN_LAPLACIAN: //拉普拉斯锐化模板 coef=(float)1.0; memcpy(CoefArray,Template_Sharpen_Laplacian,9*sizeof(int)); strcpy(filename,"c:\\shlaplac.bmp"); break; } OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER); BufSize=OffBits+bi.biHeight*LineBytes; if((hTempImgData=LocalAlloc(LHND,BufSize))==NULL){ MessageBox(hWnd,"Error alloc memory!","Error Message",MB_OK|MB_ICONEXCLAMATION);return FALSE;} lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData); lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData); lpPtr=(char *)lpImgData; lpTempPtr=(char *)lpTempImgData;//先将原图直接拷贝过来,其实主要是拷贝周围一圈的象素 memcpy(lpTempPtr,lpPtr,BufSize); for(y=1;y<bi.biHeight-1;y++) //注意y的范围是从1到bi.biHeight-2 for(x=1;x<bi.biWidth-1;x++){ //注意x的范围是从1到bi.biWidth-2 lpPtr=(char *)lpImgData+(BufSize-LineBytes-y*LineBytes)+x; lpTempPtr=(char*)lpTempImgData+(BufSize-LineBytes-y*LineBytes)+x;TempNum=(float)((unsigned char)*(lpPtr+LineBytes-1))*CoefArray[0]; TempNum+=(float)((unsigned char)*(lpPtr+LineBytes))*CoefArray[1]; TempNum+=(float)((unsigned char)*(lpPtr+LineBytes+1))*CoefArray[2]; TempNum+=(float)((unsigned char)*(lpPtr-1))*CoefArray[3]; TempNum+=(float)((unsigned char)*lpPtr)*CoefArray[4]; TempNum+=(float)((unsigned char)*(lpPtr+1))*CoefArray[5]; TempNum+=(float)((unsigned char)*(lpPtr-LineBytes-1))*CoefArray[6]; TempNum+=(float)((unsigned char)*(lpPtr-LineBytes))*CoefArray[7]; TempNum+=(float)((unsigned char)*(lpPtr-LineBytes+1))*CoefArray[8]; //最后乘以系数TempNum*=coef; //注意对溢出点的处理 if(TempNum>255.0) *lpTempPtr=(BYTE)255; else if(TempNum<0.0) *lpTempPtr=(unsigned char)fabs(TempNum); else *lpTempPtr=(BYTE)TempNum; }hDc=GetDC(hWnd); if(hBitmap!=NULL) DeleteObject(hBitmap);hBitmap=CreateDIBitmap(hDc,(LPBITMAPINFOHEADER)lpTempImgData,(LONG)CBM_INIT,(LPSTR)lpTempImgData+sizeof(BITMAPINFOHEADER)+NumColors*sizeof(RGBQUAD),(LPBITMAPINFO)lpTempImgData,DIB_RGB_COLORS);hf=_lcreat(filename,0); _lwrite(hf,(LPSTR)&bf,sizeof(BITMAPFILEHEADER)); _lwrite(hf,(LPSTR)lpTempImgData,BufSize); _lclose(hf); ReleaseDC(hWnd,hDc); LocalUnlock(hTempImgData); LocalFree(hTempImgData); GlobalUnlock(hImgData); return TRUE;}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货