常用图像处理算法.docx
《常用图像处理算法.docx》由会员分享,可在线阅读,更多相关《常用图像处理算法.docx(45页珍藏版)》请在冰豆网上搜索。
常用图像处理算法
8种常用图像处理算法(函数)
------以下所有函数均放在CimageProcessingView.ccp下
1.图像镜像
voidCCimageProcessingView:
:
OnGeomTrpo()
{
//获取指向文档的指针
CCimageProcessingDoc*pDoc=GetDocument();
//指向DIB的指针
LPSTRlpDIB;
//锁定DIB
lpDIB=(LPSTR):
GlobalLock((HGLOBAL)pDoc->GetHDIB());
//设置光标状态为等待状态
BeginWaitCursor();
//调用VertMirror函数镜像图象
if(VertMirror(lpDIB))
//设置文档修改标记
pDoc->SetModifiedFlag(TRUE);
//更新所有视图
pDoc->UpdateAllViews(NULL);
}
else
//提示信息
MessageBox("实现图象镜像失败!
");
//解除锁定
GlobalUnlock((HGLOBAL)pDoc->GetHDIB());
//结束光标等待状态
EndWaitCursor();
*函数名称:
*
*VertMirror()
*参数:
*LPSTRlpDIB//指向源DIB图像指针
*返回值:
*BOOL//镜像成功返回TRUE,否则返回FALSE。
*说明:
*该函数用来实现DIB图像的垂直镜像。
BOOLWINAPIVertMirror(LPSTRlpDIB)
//原图象宽度
LONGlWidth;
//原图象高度
LONGlHeight;
//原图象的颜色数
WORDwNumColors;
//原图象的信息头结构指针
LPBITMAPINFOHEADERlpbmi;
//指向原图象和目的图象的像素的指针
LPBYTElpSrc,lpDst;
//平移后剩余图像在源图像中的位置(矩形区域)
CRectrectSrc;
//指向原图像像素的指针
LPBYTElpDIBBits;
//指向复制图像像素的指针
LPBYTElpNewDIBBits;
//内存句柄
HLOCALh;
//循环变量
LONGi;
//图像每行的字节数
LONGlLineBytes;
//获取图象的信息头结构的指针
lpbmi=(LPBITMAPINFOHEADER)lpDIB;
//找到图象的像素位置
lpDIBBits=(LPBYTE):
FindDIBBits(lpDIB);
//获取图象的宽度
lWidth=:
DIBWidth(lpDIB);
//获取图象的高度
lHeight=:
DIBHeight(lpDIB);
//获取图象的颜色数
wNumColors=:
DIBNumColors(lpDIB);
//计算图像每行的字节数
lLineBytes=WIDTHBYTES(lWidth*(lpbmi->biBitCount));
//暂时分配内存,以保存新图像
h=LocalAlloc(LHND,lLineBytes);
//分配内存失败,直接返回
if(!
h)
returnFALSE;
//锁定内存
lpNewDIBBits=(LPBYTE)LocalLock(h);
//如果是256色位图或真彩色位图
if(wNumColors==256||wNumColors==0)
//平移图像,每次移动一行
for(i=0;i{//指向原图象倒数第i行像素起点的指针lpSrc=(LPBYTE)lpDIBBits+lLineBytes*i;//目标区域同样要注意上下倒置的问题lpDst=(LPBYTE)lpDIBBits+lLineBytes*(lHeight-i-1);//备份一行memcpy(lpNewDIBBits,lpDst,lLineBytes);//将倒数第i行像素复制到第i行memcpy(lpDst,lpSrc,lLineBytes);//将第i行像素复制到第i行memcpy(lpSrc,lpNewDIBBits,lLineBytes);}}else{AfxMessageBox("只支持256色和真彩色位图");//释放内存LocalUnlock(h);LocalFree(h);returnfalse;}//释放内存LocalUnlock(h);LocalFree(h);//返回returnTRUE;}2.旋转图像(含对话框这里对话框需要自己建立)voidCCimageProcessingView::OnGeomRota(){//获取指向文档的指针CCimageProcessingDoc*pDoc=GetDocument();//指向DIB的指针LPSTRlpDIB;//锁定DIBlpDIB=(LPSTR)::GlobalLock((HGLOBAL)pDoc->GetHDIB());//缩放比率intiRotaAngle;//创建对话框CDlgGeoRotadlgPara;//初始化变量值dlgPara.m_iRotaAngle=90;//显示对话框,提示用户设定旋转角度if(dlgPara.DoModal()!=IDOK){//返回return;}//获取用户设定的平移量iRotaAngle=dlgPara.m_iRotaAngle;//删除对话框deletedlgPara;//创建新DIBHDIBhNewDIB=NULL;//设置光标状态为等待状态BeginWaitCursor();//调用RotateDIB函数旋转DIB图象hNewDIB=(HDIB)::RotateDIB(lpDIB,iRotaAngle);//旋转成功if(hNewDIB){//替换原来的DIB图象为新的DIBpDoc->ReplaceHDIB(hNewDIB);//更新DIB图象的大小和调色板pDoc->InitDIBData();//设置文档修改标记pDoc->SetModifiedFlag(TRUE);//调节滚动视图大小SetScrollSizes(MM_TEXT,pDoc->GetDocSize());//更新所有视图pDoc->UpdateAllViews(NULL);}else{//提示信息MessageBox("实现图象旋转失败!");}//解除锁定::GlobalUnlock((HGLOBAL)pDoc->GetHDIB());//结束光标等待状态EndWaitCursor();}**函数名称:**RotateDIB()**参数:**LPSTRlpDIB//指向源DIB图像指针**intiAngle*说明:**该函数用来实现DIB图像的旋转。*************************************************************************/HGLOBALWINAPIRotateDIB(LPSTRlpDIB,intiAngle){//原图象宽度LONGlWidth;//原图象高度LONGlHeight;//旋转后图象宽度LONGlNewWidth;//旋转后图象高度LONGlNewHeight;//原图象的颜色数WORDwNumColors;//原图象的信息头结构指针LPBITMAPINFOHEADERlpbmi,lpbmi0;//指向原图象和目的图象的像素的指针LPBYTElpSrc,lpDst;//指向原图像像素的指针LPBYTElpDIBBits;//指向旋转后图像(像素)的指针LPBYTElpNewDIBBits;LPSTRlpNewDIB;//旋转后新的DIB句柄HDIBhDIB;//循环变量LONGi,j,i0,j0;//原图像每行的字节数LONGlLineBytes;//旋转后图像每行的字节数LONGlNewLineBytes;//旋转角度的弧度doublefArcAngle;//旋转角度的正弦和余弦floatfSin,fCos;//旋转前图象四个角的坐标(以图象中心为坐标系原点)floatfSrcX1,fSrcY1,fSrcX2,fSrcY2;floatfSrcX3,fSrcY3,fSrcX4,fSrcY4;//旋转后图象四个角的坐标(以图象中心为坐标系原点)floatfDstX1,fDstY1,fDstX2,fDstY2;floatfDstX3,fDstY3,fDstX4,fDstY4;//两个中间量floatf1,f2;//找到图象的像素位置lpDIBBits=(LPBYTE)::FindDIBBits(lpDIB);//获取图象的宽度lWidth=::DIBWidth(lpDIB);//获取图象的高度lHeight=::DIBHeight(lpDIB);//获取图象的颜色数wNumColors=::DIBNumColors(lpDIB);//获取指向原位图信息头结构的指针lpbmi0=(LPBITMAPINFOHEADER)lpDIB;//计算原图像每行的字节数lLineBytes=WIDTHBYTES(lWidth*(lpbmi0->biBitCount));//将旋转角度从度转换到弧度fArcAngle=(iAngle*PI)/180.0;//计算旋转角度的正弦fSin=(float)sin(fArcAngle);//计算旋转角度的余弦fCos=(float)cos(fArcAngle);//计算原图的四个角的坐标(以图像中心为坐标系原点)fSrcX1=(float)(-(lWidth-1)/2);fSrcY1=(float)((lHeight-1)/2);fSrcX2=(float)((lWidth-1)/2);fSrcY2=(float)((lHeight-1)/2);fSrcX3=(float)(-(lWidth-1)/2);fSrcY3=(float)(-(lHeight-1)/2);fSrcX4=(float)((lWidth-1)/2);fSrcY4=(float)(-(lHeight-1)/2);//计算新图四个角的坐标(以图像中心为坐标系原点)fDstX1=fCos*fSrcX1+fSin*fSrcY1;fDstY1=-fSin*fSrcX1+fCos*fSrcY1;fDstX2=fCos*fSrcX2+fSin*fSrcY2;fDstY2=-fSin*fSrcX2+fCos*fSrcY2;fDstX3=fCos*fSrcX3+fSin*fSrcY3;fDstY3=-fSin*fSrcX3+fCos*fSrcY3;fDstX4=fCos*fSrcX4+fSin*fSrcY4;fDstY4=-fSin*fSrcX4+fCos*fSrcY4;//计算旋转后的图像实际宽度lNewWidth=(LONG)(max(fabs(fDstX4-fDstX1),fabs(fDstX3-fDstX2))+0.5);//计算旋转后的图像高度lNewHeight=(LONG)(max(fabs(fDstY4-fDstY1),fabs(fDstY3-fDstY2))+0.5);//计算旋转后图像每行的字节数lNewLineBytes=WIDTHBYTES(lNewWidth*lpbmi0->biBitCount);//计算两个常数f1=(float)(-0.5*(lNewWidth-1)*fCos-0.5*(lNewHeight-1)*fSin+0.5*(lWidth-1));f2=(float)(0.5*(lNewWidth-1)*fSin-0.5*(lNewHeight-1)*fCos+0.5*(lHeight-1));//暂时分配内存,以保存新图像hDIB=(HDIB)::GlobalAlloc(GHND,lNewHeight*lNewLineBytes+*(LPDWORD)lpDIB+::PaletteSize(lpDIB));//分配内存失败,直接返回if(!hDIB)returnNULL;//锁定内存lpNewDIB=(LPSTR)::GlobalLock((HGLOBAL)hDIB);//复制DIB信息头和调色板memcpy(lpNewDIB,lpDIB,*(LPDWORD)lpDIB+::PaletteSize(lpDIB));//获取图象的信息头结构的指针lpbmi=(LPBITMAPINFOHEADER)lpNewDIB;//更新DIB图象的高度和宽度lpbmi->biWidth=lNewWidth;lpbmi->biHeight=lNewHeight;//找到新DIB像素的起始位置lpNewDIBBits=(LPBYTE)::FindDIBBits(lpNewDIB);//如果是256色位图if(wNumColors==256){//旋转后图像每行for(i=0;i{//旋转后图象每列for(j=0;j{//指向图象第i行第j个像素的指针lpDst=(LPBYTE)lpNewDIBBits+lNewLineBytes*(lNewHeight-1-i)+j;//计算每个像素点在原图象中的坐标i0=(LONG)(-((float)j)*fSin+((float)i)*fCos+f2+0.5);j0=(LONG)(((float)j)*fCos+((float)i)*fSin+f1+0.5);//判断是否在源图象范围之内if((j0>=0)&&(j0=0)&&(i0{//指向源DIB图象第i0行,第j0个象素的指针lpSrc=(LPBYTE)lpDIBBits+lLineBytes*(lHeight-1-i0)+j0;//复制象素*lpDst=*lpSrc;}else{//对于源图中没有的象素,直接赋值为255*((LPBYTE)lpDst)=255;}}}}//如果是24位真彩色位图elseif(wNumColors==0){//旋转后图像每行for(i=0;i{//旋转后图象每列for(j=0;j{//指向图象第i行第j个像素的指针lpDst=(LPBYTE)lpNewDIBBits+lNewLineBytes*(lNewHeight-1-i)+3*j;//计算每个像素点在原图象中的坐标i0=(LONG)(-((float)j)*fSin+((float)i)*fCos+f2+0.5);j0=(LONG)(((float)j)*fCos+((float)i)*fSin+f1+0.5);//判断是否在源图象范围之内if((j0>=0)&&(j0=0)&&(i0{//指向源DIB图象第i0行,第j0个象素的指针lpSrc=(LPBYTE)lpDIBBits+lLineBytes*(lHeight-1-i0)+3*j0;//复制象素memcpy(lpDst,lpSrc,3);}else{//对于源图中没有的象素,直接赋值为255memset(lpDst,255,3);}}}}else{AfxMessageBox("只支持256色和真彩色位图");//释放内存GlobalUnlock(hDIB);GlobalFree(hDIB);returnNULL;}//返回returnhDIB;}3.图像缩放(对话框自己建立)voidCCimageProcessingView::OnGeomZoom(){//TODO:Addyourcommandhandlercodehere//图像缩放//获取文档CCimageProcessingDoc*pDoc=GetDocument();//指向DIB的指针LPSTRlpDIB;//锁定DIBlpDIB=(LPSTR)::GlobalLock((HGLOBAL)pDoc->GetHDIB());//缩放比率floatfXZoomRatio;floatfYZoomRatio;//创建对话框CDlgGeoZoomdlgPara;//初始化变量值dlgPara.m_XZoom=0.5;dlgPara.m_YZoom=0.5;//显示对话框,提示用户设定平移量if(dlgPara.DoModal()!=IDOK){//返回return;}//获取用户设定的平移量fXZoomRatio=dlgPara.m_XZoom;fYZoomRatio=dlgPara.m_YZoom;//删除对话框deletedlgPara;//创建新DIBHDIBhNewDIB=NULL;//更改光标形状BeginWaitCursor();//调用ZoomDIB()函数转置DIBhNewDIB=(HDIB)ZoomDIB(lpDIB,fXZoomRatio,fYZoomRatio);//判断缩放是否成功if(hNewDIB!=NULL){//替换DIB,同时释放旧DIB对象pDoc->ReplaceHDIB(hNewDIB);//更新DIB大小和调色板pDoc->InitDIBData();//设置脏标记pDoc->SetModifiedFlag(TRUE);//重新设置滚动视图大小SetScrollSizes(MM_TEXT,pDoc->GetDocSize());//更新视图pDoc->UpdateAllViews(NULL);}else{//提示用户MessageBox("分配内存失败!","系统提示",MB_ICONINFORMATION|MB_OK);}//解除锁定::GlobalUnlock((HGLOBAL)pDoc->GetHDIB());//恢复光标EndWaitCursor();}/***************************************************************************函数名称:*ZoomDIB()**参数:*LPSTRlpDIB-指向源DIB的指针*floatfXZoomRatio-X轴方向缩放比率*floatfYZoomRatio-Y轴方向缩放比率**返回值:*HGLOBAL-缩放成功返回新DIB句柄,否则返回NULL。**说明:*该函数用来缩放DIB图像,返回新生成DIB的句柄。*************************************************************************/HGLOBALWINAPIZoomDIB(LPSTRlpDIB,floatfXZoomRatio,floatfYZoomRatio){//源图像的宽度和高度LONGlWidth;LONGlHeight;//缩放后图像的宽度和高度LONGlNewWidth;LONGlNewHeight;WORDwNumColors;//缩放后图像的宽度(lNewWidth',必须是4的倍数)LONGlNewLineBytes;//指向源图像的指针LPBYTElpDIBBits;//指向源象素的指针LPBYTElpSrc;//缩放后新DIB句柄HDIBhDIB;//指向缩放图像对应象素的指针LPBYTElpDst;//指向缩放图像的指针LPSTRlpNewDIB;LPBYTElpNewDIBBits;//指向BITMAPINFO结构的指针(Win3.0)LPBITMAPINFOHEADERlpbmi,lpbmi0;//指向BITMAPCOREINFO结构的指针LPBITMAPCOREHEADERlpbmc;//循环变量(象素在新DIB中的坐标)LONGi;LONGj;//象素在源DIB中的坐标LONGi0;LONGj0;//图像每行的字节数LONGlLineBytes;//找到源DIB图像象素起始位置lpDIBBits=(LPBYTE)::FindDIBBits(lpDIB);//获取图像的宽度lWidth=::DIBWidth(lpDIB);//获取图像的高度lHeight=::DIBHeight(lpDIB);wNumColors=
//指向原图象倒数第i行像素起点的指针
lpSrc=(LPBYTE)lpDIBBits+lLineBytes*i;
//目标区域同样要注意上下倒置的问题
lpDst=(LPBYTE)lpDIBBits+lLineBytes*(lHeight-i-1);
//备份一行
memcpy(lpNewDIBBits,lpDst,lLineBytes);
//将倒数第i行像素复制到第i行
memcpy(lpDst,lpSrc,lLineBytes);
//将第i行像素复制到第i行
memcpy(lpSrc,lpNewDIBBits,lLineBytes);
AfxMessageBox("只支持256色和真彩色位图");
//释放内存
LocalUnlock(h);
LocalFree(h);
returnfalse;
//返回
returnTRUE;
2.旋转图像(含对话框这里对话框需要自己建立)
OnGeomRota()
//缩放比率
intiRotaAngle;
//创建对话框
CDlgGeoRotadlgPara;
//初始化变量值
dlgPara.m_iRotaAngle=90;
//显示对话框,提示用户设定旋转角度
if(dlgPara.DoModal()!
=IDOK)
return;
//获取用户设定的平移量
iRotaAngle=dlgPara.m_iRotaAngle;
//删除对话框
deletedlgPara;
//创建新DIB
HDIBhNewDIB=NULL;
//调用RotateDIB函数旋转DIB图象
hNewDIB=(HDIB):
RotateDIB(lpDIB,iRotaAngle);
//旋转成功
if(hNewDIB)
//替换原来的DIB图象为新的DIB
pDoc->ReplaceHDIB(hNewDIB);
//更新DIB图象的大小和调色板
pDoc->InitDIBData();
//调节滚动视图大小
SetScrollSizes(MM_TEXT,pDoc->GetDocSize());
MessageBox("实现图象旋转失败!
*RotateDIB()
*intiAngle
*该函数用来实现DIB图像的旋转。
************************************************************************/
HGLOBALWINAPIRotateDIB(LPSTRlpDIB,intiAngle)
//旋转后图象宽度
LONGlNewWidth;
//旋转后图象高度
LONGlNewHeight;
LPBITMAPINFOHEADERlpbmi,lpbmi0;
//指向旋转后图像(像素)的指针
LPSTRlpNewDIB;
//旋转后新的DIB句柄
HDIBhDIB;
LONGi,j,i0,j0;
//原图像每行的字节数
//旋转后图像每行的字节数
LONGlNewLineBytes;
//旋转角度的弧度
doublefArcAngle;
//旋转角度的正弦和余弦
floatfSin,fCos;
//旋转前图象四个角的坐标(以图象中心为坐标系原点)
floatfSrcX1,fSrcY1,fSrcX2,fSrcY2;
floatfSrcX3,fSrcY3,fSrcX4,fSrcY4;
//旋转后图象四个角的坐标(以图象中心为坐标系原点)
floatfDstX1,fDstY1,fDstX2,fDstY2;
floatfDstX3,fDstY3,fDstX4,fDstY4;
//两个中间量
floatf1,f2;
//获取指向原位图信息头结构的指针
lpbmi0=(LPBITMAPINFOHEADER)lpDIB;
//计算原图像每行的字节数
lLineBytes=WIDTHBYTES(lWidth*(lpbmi0->biBitCount));
//将旋转角度从度转换到弧度
fArcAngle=(iAngle*PI)/180.0;
//计算旋转角度的正弦
fSin=(float)sin(fArcAngle);
//计算旋转角度的余弦
fCos=(float)cos(fArcAngle);
//计算原图的四个角的坐标(以图像中心为坐标系原点)
fSrcX1=(float)(-(lWidth-1)/2);
fSrcY1=(float)((lHeight-1)/2);
fSrcX2=(float)((lWidth-1)/2);
fSrcY2=(float)((lHeight-1)/2);
fSrcX3=(float)(-(lWidth-1)/2);
fSrcY3=(float)(-(lHeight-1)/2);
fSrcX4=(float)((lWidth-1)/2);
fSrcY4=(float)(-(lHeight-1)/2);
//计算新图四个角的坐标(以图像中心为坐标系原点)
fDstX1=fCos*fSrcX1+fSin*fSrcY1;
fDstY1=-fSin*fSrcX1+fCos*fSrcY1;
fDstX2=fCos*fSrcX2+fSin*fSrcY2;
fDstY2=-fSin*fSrcX2+fCos*fSrcY2;
fDstX3=fCos*fSrcX3+fSin*fSrcY3;
fDstY3=-fSin*fSrcX3+fCos*fSrcY3;
fDstX4=fCos*fSrcX4+fSin*fSrcY4;
fDstY4=-fSin*fSrcX4+fCos*fSrcY4;
//计算旋转后的图像实际宽度
lNewWidth=(LONG)(max(fabs(fDstX4-fDstX1),
fabs(fDstX3-fDstX2))+0.5);
//计算旋转后的图像高度
lNewHeight=(LONG)(max(fabs(fDstY4-fDstY1),
fabs(fDstY3-fDstY2))+0.5);
//计算旋转后图像每行的字节数
lNewLineBytes=WIDTHBYTES(lNewWidth*lpbmi0->biBitCount);
//计算两个常数
f1=(float)(-0.5*(lNewWidth-1)*fCos-0.5*(lNewHeight-1)*fSin
+0.5*(lWidth-1));
f2=(float)(0.5*(lNewWidth-1)*fSin-0.5*(lNewHeight-1)*fCos
+0.5*(lHeight-1));
hDIB=(HDIB):
GlobalAlloc(GHND,lNewHeight*lNewLineBytes+
*(LPDWORD)lpDIB+:
PaletteSize(lpDIB));
hDIB)
returnNULL;
lpNewDIB=(LPSTR):
GlobalLock((HGLOBAL)hDIB);
//复制DIB信息头和调色板
memcpy(lpNewDIB,lpDIB,*(LPDWORD)lpDIB+:
lpbmi=(LPBITMAPINFOHEADER)lpNewDIB;
//更新DIB图象的高度和宽度
lpbmi->biWidth=lNewWidth;
lpbmi->biHeight=lNewHeight;
//找到新DIB像素的起始位置
lpNewDIBBits=(LPBYTE):
FindDIBBits(lpNewDIB);
//如果是256色位图
if(wNumColors==256)
//旋转后图像每行
for(i=0;i{//旋转后图象每列for(j=0;j{//指向图象第i行第j个像素的指针lpDst=(LPBYTE)lpNewDIBBits+lNewLineBytes*(lNewHeight-1-i)+j;//计算每个像素点在原图象中的坐标i0=(LONG)(-((float)j)*fSin+((float)i)*fCos+f2+0.5);j0=(LONG)(((float)j)*fCos+((float)i)*fSin+f1+0.5);//判断是否在源图象范围之内if((j0>=0)&&(j0=0)&&(i0{//指向源DIB图象第i0行,第j0个象素的指针lpSrc=(LPBYTE)lpDIBBits+lLineBytes*(lHeight-1-i0)+j0;//复制象素*lpDst=*lpSrc;}else{//对于源图中没有的象素,直接赋值为255*((LPBYTE)lpDst)=255;}}}}//如果是24位真彩色位图elseif(wNumColors==0){//旋转后图像每行for(i=0;i{//旋转后图象每列for(j=0;j{//指向图象第i行第j个像素的指针lpDst=(LPBYTE)lpNewDIBBits+lNewLineBytes*(lNewHeight-1-i)+3*j;//计算每个像素点在原图象中的坐标i0=(LONG)(-((float)j)*fSin+((float)i)*fCos+f2+0.5);j0=(LONG)(((float)j)*fCos+((float)i)*fSin+f1+0.5);//判断是否在源图象范围之内if((j0>=0)&&(j0=0)&&(i0{//指向源DIB图象第i0行,第j0个象素的指针lpSrc=(LPBYTE)lpDIBBits+lLineBytes*(lHeight-1-i0)+3*j0;//复制象素memcpy(lpDst,lpSrc,3);}else{//对于源图中没有的象素,直接赋值为255memset(lpDst,255,3);}}}}else{AfxMessageBox("只支持256色和真彩色位图");//释放内存GlobalUnlock(hDIB);GlobalFree(hDIB);returnNULL;}//返回returnhDIB;}3.图像缩放(对话框自己建立)voidCCimageProcessingView::OnGeomZoom(){//TODO:Addyourcommandhandlercodehere//图像缩放//获取文档CCimageProcessingDoc*pDoc=GetDocument();//指向DIB的指针LPSTRlpDIB;//锁定DIBlpDIB=(LPSTR)::GlobalLock((HGLOBAL)pDoc->GetHDIB());//缩放比率floatfXZoomRatio;floatfYZoomRatio;//创建对话框CDlgGeoZoomdlgPara;//初始化变量值dlgPara.m_XZoom=0.5;dlgPara.m_YZoom=0.5;//显示对话框,提示用户设定平移量if(dlgPara.DoModal()!=IDOK){//返回return;}//获取用户设定的平移量fXZoomRatio=dlgPara.m_XZoom;fYZoomRatio=dlgPara.m_YZoom;//删除对话框deletedlgPara;//创建新DIBHDIBhNewDIB=NULL;//更改光标形状BeginWaitCursor();//调用ZoomDIB()函数转置DIBhNewDIB=(HDIB)ZoomDIB(lpDIB,fXZoomRatio,fYZoomRatio);//判断缩放是否成功if(hNewDIB!=NULL){//替换DIB,同时释放旧DIB对象pDoc->ReplaceHDIB(hNewDIB);//更新DIB大小和调色板pDoc->InitDIBData();//设置脏标记pDoc->SetModifiedFlag(TRUE);//重新设置滚动视图大小SetScrollSizes(MM_TEXT,pDoc->GetDocSize());//更新视图pDoc->UpdateAllViews(NULL);}else{//提示用户MessageBox("分配内存失败!","系统提示",MB_ICONINFORMATION|MB_OK);}//解除锁定::GlobalUnlock((HGLOBAL)pDoc->GetHDIB());//恢复光标EndWaitCursor();}/***************************************************************************函数名称:*ZoomDIB()**参数:*LPSTRlpDIB-指向源DIB的指针*floatfXZoomRatio-X轴方向缩放比率*floatfYZoomRatio-Y轴方向缩放比率**返回值:*HGLOBAL-缩放成功返回新DIB句柄,否则返回NULL。**说明:*该函数用来缩放DIB图像,返回新生成DIB的句柄。*************************************************************************/HGLOBALWINAPIZoomDIB(LPSTRlpDIB,floatfXZoomRatio,floatfYZoomRatio){//源图像的宽度和高度LONGlWidth;LONGlHeight;//缩放后图像的宽度和高度LONGlNewWidth;LONGlNewHeight;WORDwNumColors;//缩放后图像的宽度(lNewWidth',必须是4的倍数)LONGlNewLineBytes;//指向源图像的指针LPBYTElpDIBBits;//指向源象素的指针LPBYTElpSrc;//缩放后新DIB句柄HDIBhDIB;//指向缩放图像对应象素的指针LPBYTElpDst;//指向缩放图像的指针LPSTRlpNewDIB;LPBYTElpNewDIBBits;//指向BITMAPINFO结构的指针(Win3.0)LPBITMAPINFOHEADERlpbmi,lpbmi0;//指向BITMAPCOREINFO结构的指针LPBITMAPCOREHEADERlpbmc;//循环变量(象素在新DIB中的坐标)LONGi;LONGj;//象素在源DIB中的坐标LONGi0;LONGj0;//图像每行的字节数LONGlLineBytes;//找到源DIB图像象素起始位置lpDIBBits=(LPBYTE)::FindDIBBits(lpDIB);//获取图像的宽度lWidth=::DIBWidth(lpDIB);//获取图像的高度lHeight=::DIBHeight(lpDIB);wNumColors=
//旋转后图象每列
for(j=0;j{//指向图象第i行第j个像素的指针lpDst=(LPBYTE)lpNewDIBBits+lNewLineBytes*(lNewHeight-1-i)+j;//计算每个像素点在原图象中的坐标i0=(LONG)(-((float)j)*fSin+((float)i)*fCos+f2+0.5);j0=(LONG)(((float)j)*fCos+((float)i)*fSin+f1+0.5);//判断是否在源图象范围之内if((j0>=0)&&(j0=0)&&(i0{//指向源DIB图象第i0行,第j0个象素的指针lpSrc=(LPBYTE)lpDIBBits+lLineBytes*(lHeight-1-i0)+j0;//复制象素*lpDst=*lpSrc;}else{//对于源图中没有的象素,直接赋值为255*((LPBYTE)lpDst)=255;}}}}//如果是24位真彩色位图elseif(wNumColors==0){//旋转后图像每行for(i=0;i{//旋转后图象每列for(j=0;j{//指向图象第i行第j个像素的指针lpDst=(LPBYTE)lpNewDIBBits+lNewLineBytes*(lNewHeight-1-i)+3*j;//计算每个像素点在原图象中的坐标i0=(LONG)(-((float)j)*fSin+((float)i)*fCos+f2+0.5);j0=(LONG)(((float)j)*fCos+((float)i)*fSin+f1+0.5);//判断是否在源图象范围之内if((j0>=0)&&(j0=0)&&(i0{//指向源DIB图象第i0行,第j0个象素的指针lpSrc=(LPBYTE)lpDIBBits+lLineBytes*(lHeight-1-i0)+3*j0;//复制象素memcpy(lpDst,lpSrc,3);}else{//对于源图中没有的象素,直接赋值为255memset(lpDst,255,3);}}}}else{AfxMessageBox("只支持256色和真彩色位图");//释放内存GlobalUnlock(hDIB);GlobalFree(hDIB);returnNULL;}//返回returnhDIB;}3.图像缩放(对话框自己建立)voidCCimageProcessingView::OnGeomZoom(){//TODO:Addyourcommandhandlercodehere//图像缩放//获取文档CCimageProcessingDoc*pDoc=GetDocument();//指向DIB的指针LPSTRlpDIB;//锁定DIBlpDIB=(LPSTR)::GlobalLock((HGLOBAL)pDoc->GetHDIB());//缩放比率floatfXZoomRatio;floatfYZoomRatio;//创建对话框CDlgGeoZoomdlgPara;//初始化变量值dlgPara.m_XZoom=0.5;dlgPara.m_YZoom=0.5;//显示对话框,提示用户设定平移量if(dlgPara.DoModal()!=IDOK){//返回return;}//获取用户设定的平移量fXZoomRatio=dlgPara.m_XZoom;fYZoomRatio=dlgPara.m_YZoom;//删除对话框deletedlgPara;//创建新DIBHDIBhNewDIB=NULL;//更改光标形状BeginWaitCursor();//调用ZoomDIB()函数转置DIBhNewDIB=(HDIB)ZoomDIB(lpDIB,fXZoomRatio,fYZoomRatio);//判断缩放是否成功if(hNewDIB!=NULL){//替换DIB,同时释放旧DIB对象pDoc->ReplaceHDIB(hNewDIB);//更新DIB大小和调色板pDoc->InitDIBData();//设置脏标记pDoc->SetModifiedFlag(TRUE);//重新设置滚动视图大小SetScrollSizes(MM_TEXT,pDoc->GetDocSize());//更新视图pDoc->UpdateAllViews(NULL);}else{//提示用户MessageBox("分配内存失败!","系统提示",MB_ICONINFORMATION|MB_OK);}//解除锁定::GlobalUnlock((HGLOBAL)pDoc->GetHDIB());//恢复光标EndWaitCursor();}/***************************************************************************函数名称:*ZoomDIB()**参数:*LPSTRlpDIB-指向源DIB的指针*floatfXZoomRatio-X轴方向缩放比率*floatfYZoomRatio-Y轴方向缩放比率**返回值:*HGLOBAL-缩放成功返回新DIB句柄,否则返回NULL。**说明:*该函数用来缩放DIB图像,返回新生成DIB的句柄。*************************************************************************/HGLOBALWINAPIZoomDIB(LPSTRlpDIB,floatfXZoomRatio,floatfYZoomRatio){//源图像的宽度和高度LONGlWidth;LONGlHeight;//缩放后图像的宽度和高度LONGlNewWidth;LONGlNewHeight;WORDwNumColors;//缩放后图像的宽度(lNewWidth',必须是4的倍数)LONGlNewLineBytes;//指向源图像的指针LPBYTElpDIBBits;//指向源象素的指针LPBYTElpSrc;//缩放后新DIB句柄HDIBhDIB;//指向缩放图像对应象素的指针LPBYTElpDst;//指向缩放图像的指针LPSTRlpNewDIB;LPBYTElpNewDIBBits;//指向BITMAPINFO结构的指针(Win3.0)LPBITMAPINFOHEADERlpbmi,lpbmi0;//指向BITMAPCOREINFO结构的指针LPBITMAPCOREHEADERlpbmc;//循环变量(象素在新DIB中的坐标)LONGi;LONGj;//象素在源DIB中的坐标LONGi0;LONGj0;//图像每行的字节数LONGlLineBytes;//找到源DIB图像象素起始位置lpDIBBits=(LPBYTE)::FindDIBBits(lpDIB);//获取图像的宽度lWidth=::DIBWidth(lpDIB);//获取图像的高度lHeight=::DIBHeight(lpDIB);wNumColors=
//指向图象第i行第j个像素的指针
lpDst=(LPBYTE)lpNewDIBBits+lNewLineBytes*(lNewHeight-1-i)+j;
//计算每个像素点在原图象中的坐标
i0=(LONG)(-((float)j)*fSin+((float)i)*fCos+f2+0.5);
j0=(LONG)(((float)j)*fCos+((float)i)*fSin+f1+0.5);
//判断是否在源图象范围之内
if((j0>=0)&&(j0=0)&&(i0{//指向源DIB图象第i0行,第j0个象素的指针lpSrc=(LPBYTE)lpDIBBits+lLineBytes*(lHeight-1-i0)+j0;//复制象素*lpDst=*lpSrc;}else{//对于源图中没有的象素,直接赋值为255*((LPBYTE)lpDst)=255;}}}}//如果是24位真彩色位图elseif(wNumColors==0){//旋转后图像每行for(i=0;i{//旋转后图象每列for(j=0;j{//指向图象第i行第j个像素的指针lpDst=(LPBYTE)lpNewDIBBits+lNewLineBytes*(lNewHeight-1-i)+3*j;//计算每个像素点在原图象中的坐标i0=(LONG)(-((float)j)*fSin+((float)i)*fCos+f2+0.5);j0=(LONG)(((float)j)*fCos+((float)i)*fSin+f1+0.5);//判断是否在源图象范围之内if((j0>=0)&&(j0=0)&&(i0{//指向源DIB图象第i0行,第j0个象素的指针lpSrc=(LPBYTE)lpDIBBits+lLineBytes*(lHeight-1-i0)+3*j0;//复制象素memcpy(lpDst,lpSrc,3);}else{//对于源图中没有的象素,直接赋值为255memset(lpDst,255,3);}}}}else{AfxMessageBox("只支持256色和真彩色位图");//释放内存GlobalUnlock(hDIB);GlobalFree(hDIB);returnNULL;}//返回returnhDIB;}3.图像缩放(对话框自己建立)voidCCimageProcessingView::OnGeomZoom(){//TODO:Addyourcommandhandlercodehere//图像缩放//获取文档CCimageProcessingDoc*pDoc=GetDocument();//指向DIB的指针LPSTRlpDIB;//锁定DIBlpDIB=(LPSTR)::GlobalLock((HGLOBAL)pDoc->GetHDIB());//缩放比率floatfXZoomRatio;floatfYZoomRatio;//创建对话框CDlgGeoZoomdlgPara;//初始化变量值dlgPara.m_XZoom=0.5;dlgPara.m_YZoom=0.5;//显示对话框,提示用户设定平移量if(dlgPara.DoModal()!=IDOK){//返回return;}//获取用户设定的平移量fXZoomRatio=dlgPara.m_XZoom;fYZoomRatio=dlgPara.m_YZoom;//删除对话框deletedlgPara;//创建新DIBHDIBhNewDIB=NULL;//更改光标形状BeginWaitCursor();//调用ZoomDIB()函数转置DIBhNewDIB=(HDIB)ZoomDIB(lpDIB,fXZoomRatio,fYZoomRatio);//判断缩放是否成功if(hNewDIB!=NULL){//替换DIB,同时释放旧DIB对象pDoc->ReplaceHDIB(hNewDIB);//更新DIB大小和调色板pDoc->InitDIBData();//设置脏标记pDoc->SetModifiedFlag(TRUE);//重新设置滚动视图大小SetScrollSizes(MM_TEXT,pDoc->GetDocSize());//更新视图pDoc->UpdateAllViews(NULL);}else{//提示用户MessageBox("分配内存失败!","系统提示",MB_ICONINFORMATION|MB_OK);}//解除锁定::GlobalUnlock((HGLOBAL)pDoc->GetHDIB());//恢复光标EndWaitCursor();}/***************************************************************************函数名称:*ZoomDIB()**参数:*LPSTRlpDIB-指向源DIB的指针*floatfXZoomRatio-X轴方向缩放比率*floatfYZoomRatio-Y轴方向缩放比率**返回值:*HGLOBAL-缩放成功返回新DIB句柄,否则返回NULL。**说明:*该函数用来缩放DIB图像,返回新生成DIB的句柄。*************************************************************************/HGLOBALWINAPIZoomDIB(LPSTRlpDIB,floatfXZoomRatio,floatfYZoomRatio){//源图像的宽度和高度LONGlWidth;LONGlHeight;//缩放后图像的宽度和高度LONGlNewWidth;LONGlNewHeight;WORDwNumColors;//缩放后图像的宽度(lNewWidth',必须是4的倍数)LONGlNewLineBytes;//指向源图像的指针LPBYTElpDIBBits;//指向源象素的指针LPBYTElpSrc;//缩放后新DIB句柄HDIBhDIB;//指向缩放图像对应象素的指针LPBYTElpDst;//指向缩放图像的指针LPSTRlpNewDIB;LPBYTElpNewDIBBits;//指向BITMAPINFO结构的指针(Win3.0)LPBITMAPINFOHEADERlpbmi,lpbmi0;//指向BITMAPCOREINFO结构的指针LPBITMAPCOREHEADERlpbmc;//循环变量(象素在新DIB中的坐标)LONGi;LONGj;//象素在源DIB中的坐标LONGi0;LONGj0;//图像每行的字节数LONGlLineBytes;//找到源DIB图像象素起始位置lpDIBBits=(LPBYTE)::FindDIBBits(lpDIB);//获取图像的宽度lWidth=::DIBWidth(lpDIB);//获取图像的高度lHeight=::DIBHeight(lpDIB);wNumColors=
//指向源DIB图象第i0行,第j0个象素的指针
lpSrc=(LPBYTE)lpDIBBits+lLineBytes*(lHeight-1-i0)+j0;
//复制象素
*lpDst=*lpSrc;
//对于源图中没有的象素,直接赋值为255
*((LPBYTE)lpDst)=255;
//如果是24位真彩色位图
elseif(wNumColors==0)
for(i=0;i{//旋转后图象每列for(j=0;j{//指向图象第i行第j个像素的指针lpDst=(LPBYTE)lpNewDIBBits+lNewLineBytes*(lNewHeight-1-i)+3*j;//计算每个像素点在原图象中的坐标i0=(LONG)(-((float)j)*fSin+((float)i)*fCos+f2+0.5);j0=(LONG)(((float)j)*fCos+((float)i)*fSin+f1+0.5);//判断是否在源图象范围之内if((j0>=0)&&(j0=0)&&(i0{//指向源DIB图象第i0行,第j0个象素的指针lpSrc=(LPBYTE)lpDIBBits+lLineBytes*(lHeight-1-i0)+3*j0;//复制象素memcpy(lpDst,lpSrc,3);}else{//对于源图中没有的象素,直接赋值为255memset(lpDst,255,3);}}}}else{AfxMessageBox("只支持256色和真彩色位图");//释放内存GlobalUnlock(hDIB);GlobalFree(hDIB);returnNULL;}//返回returnhDIB;}3.图像缩放(对话框自己建立)voidCCimageProcessingView::OnGeomZoom(){//TODO:Addyourcommandhandlercodehere//图像缩放//获取文档CCimageProcessingDoc*pDoc=GetDocument();//指向DIB的指针LPSTRlpDIB;//锁定DIBlpDIB=(LPSTR)::GlobalLock((HGLOBAL)pDoc->GetHDIB());//缩放比率floatfXZoomRatio;floatfYZoomRatio;//创建对话框CDlgGeoZoomdlgPara;//初始化变量值dlgPara.m_XZoom=0.5;dlgPara.m_YZoom=0.5;//显示对话框,提示用户设定平移量if(dlgPara.DoModal()!=IDOK){//返回return;}//获取用户设定的平移量fXZoomRatio=dlgPara.m_XZoom;fYZoomRatio=dlgPara.m_YZoom;//删除对话框deletedlgPara;//创建新DIBHDIBhNewDIB=NULL;//更改光标形状BeginWaitCursor();//调用ZoomDIB()函数转置DIBhNewDIB=(HDIB)ZoomDIB(lpDIB,fXZoomRatio,fYZoomRatio);//判断缩放是否成功if(hNewDIB!=NULL){//替换DIB,同时释放旧DIB对象pDoc->ReplaceHDIB(hNewDIB);//更新DIB大小和调色板pDoc->InitDIBData();//设置脏标记pDoc->SetModifiedFlag(TRUE);//重新设置滚动视图大小SetScrollSizes(MM_TEXT,pDoc->GetDocSize());//更新视图pDoc->UpdateAllViews(NULL);}else{//提示用户MessageBox("分配内存失败!","系统提示",MB_ICONINFORMATION|MB_OK);}//解除锁定::GlobalUnlock((HGLOBAL)pDoc->GetHDIB());//恢复光标EndWaitCursor();}/***************************************************************************函数名称:*ZoomDIB()**参数:*LPSTRlpDIB-指向源DIB的指针*floatfXZoomRatio-X轴方向缩放比率*floatfYZoomRatio-Y轴方向缩放比率**返回值:*HGLOBAL-缩放成功返回新DIB句柄,否则返回NULL。**说明:*该函数用来缩放DIB图像,返回新生成DIB的句柄。*************************************************************************/HGLOBALWINAPIZoomDIB(LPSTRlpDIB,floatfXZoomRatio,floatfYZoomRatio){//源图像的宽度和高度LONGlWidth;LONGlHeight;//缩放后图像的宽度和高度LONGlNewWidth;LONGlNewHeight;WORDwNumColors;//缩放后图像的宽度(lNewWidth',必须是4的倍数)LONGlNewLineBytes;//指向源图像的指针LPBYTElpDIBBits;//指向源象素的指针LPBYTElpSrc;//缩放后新DIB句柄HDIBhDIB;//指向缩放图像对应象素的指针LPBYTElpDst;//指向缩放图像的指针LPSTRlpNewDIB;LPBYTElpNewDIBBits;//指向BITMAPINFO结构的指针(Win3.0)LPBITMAPINFOHEADERlpbmi,lpbmi0;//指向BITMAPCOREINFO结构的指针LPBITMAPCOREHEADERlpbmc;//循环变量(象素在新DIB中的坐标)LONGi;LONGj;//象素在源DIB中的坐标LONGi0;LONGj0;//图像每行的字节数LONGlLineBytes;//找到源DIB图像象素起始位置lpDIBBits=(LPBYTE)::FindDIBBits(lpDIB);//获取图像的宽度lWidth=::DIBWidth(lpDIB);//获取图像的高度lHeight=::DIBHeight(lpDIB);wNumColors=
for(j=0;j{//指向图象第i行第j个像素的指针lpDst=(LPBYTE)lpNewDIBBits+lNewLineBytes*(lNewHeight-1-i)+3*j;//计算每个像素点在原图象中的坐标i0=(LONG)(-((float)j)*fSin+((float)i)*fCos+f2+0.5);j0=(LONG)(((float)j)*fCos+((float)i)*fSin+f1+0.5);//判断是否在源图象范围之内if((j0>=0)&&(j0=0)&&(i0{//指向源DIB图象第i0行,第j0个象素的指针lpSrc=(LPBYTE)lpDIBBits+lLineBytes*(lHeight-1-i0)+3*j0;//复制象素memcpy(lpDst,lpSrc,3);}else{//对于源图中没有的象素,直接赋值为255memset(lpDst,255,3);}}}}else{AfxMessageBox("只支持256色和真彩色位图");//释放内存GlobalUnlock(hDIB);GlobalFree(hDIB);returnNULL;}//返回returnhDIB;}3.图像缩放(对话框自己建立)voidCCimageProcessingView::OnGeomZoom(){//TODO:Addyourcommandhandlercodehere//图像缩放//获取文档CCimageProcessingDoc*pDoc=GetDocument();//指向DIB的指针LPSTRlpDIB;//锁定DIBlpDIB=(LPSTR)::GlobalLock((HGLOBAL)pDoc->GetHDIB());//缩放比率floatfXZoomRatio;floatfYZoomRatio;//创建对话框CDlgGeoZoomdlgPara;//初始化变量值dlgPara.m_XZoom=0.5;dlgPara.m_YZoom=0.5;//显示对话框,提示用户设定平移量if(dlgPara.DoModal()!=IDOK){//返回return;}//获取用户设定的平移量fXZoomRatio=dlgPara.m_XZoom;fYZoomRatio=dlgPara.m_YZoom;//删除对话框deletedlgPara;//创建新DIBHDIBhNewDIB=NULL;//更改光标形状BeginWaitCursor();//调用ZoomDIB()函数转置DIBhNewDIB=(HDIB)ZoomDIB(lpDIB,fXZoomRatio,fYZoomRatio);//判断缩放是否成功if(hNewDIB!=NULL){//替换DIB,同时释放旧DIB对象pDoc->ReplaceHDIB(hNewDIB);//更新DIB大小和调色板pDoc->InitDIBData();//设置脏标记pDoc->SetModifiedFlag(TRUE);//重新设置滚动视图大小SetScrollSizes(MM_TEXT,pDoc->GetDocSize());//更新视图pDoc->UpdateAllViews(NULL);}else{//提示用户MessageBox("分配内存失败!","系统提示",MB_ICONINFORMATION|MB_OK);}//解除锁定::GlobalUnlock((HGLOBAL)pDoc->GetHDIB());//恢复光标EndWaitCursor();}/***************************************************************************函数名称:*ZoomDIB()**参数:*LPSTRlpDIB-指向源DIB的指针*floatfXZoomRatio-X轴方向缩放比率*floatfYZoomRatio-Y轴方向缩放比率**返回值:*HGLOBAL-缩放成功返回新DIB句柄,否则返回NULL。**说明:*该函数用来缩放DIB图像,返回新生成DIB的句柄。*************************************************************************/HGLOBALWINAPIZoomDIB(LPSTRlpDIB,floatfXZoomRatio,floatfYZoomRatio){//源图像的宽度和高度LONGlWidth;LONGlHeight;//缩放后图像的宽度和高度LONGlNewWidth;LONGlNewHeight;WORDwNumColors;//缩放后图像的宽度(lNewWidth',必须是4的倍数)LONGlNewLineBytes;//指向源图像的指针LPBYTElpDIBBits;//指向源象素的指针LPBYTElpSrc;//缩放后新DIB句柄HDIBhDIB;//指向缩放图像对应象素的指针LPBYTElpDst;//指向缩放图像的指针LPSTRlpNewDIB;LPBYTElpNewDIBBits;//指向BITMAPINFO结构的指针(Win3.0)LPBITMAPINFOHEADERlpbmi,lpbmi0;//指向BITMAPCOREINFO结构的指针LPBITMAPCOREHEADERlpbmc;//循环变量(象素在新DIB中的坐标)LONGi;LONGj;//象素在源DIB中的坐标LONGi0;LONGj0;//图像每行的字节数LONGlLineBytes;//找到源DIB图像象素起始位置lpDIBBits=(LPBYTE)::FindDIBBits(lpDIB);//获取图像的宽度lWidth=::DIBWidth(lpDIB);//获取图像的高度lHeight=::DIBHeight(lpDIB);wNumColors=
lpDst=(LPBYTE)lpNewDIBBits+lNewLineBytes*(lNewHeight-1-i)+3*j;
if((j0>=0)&&(j0=0)&&(i0{//指向源DIB图象第i0行,第j0个象素的指针lpSrc=(LPBYTE)lpDIBBits+lLineBytes*(lHeight-1-i0)+3*j0;//复制象素memcpy(lpDst,lpSrc,3);}else{//对于源图中没有的象素,直接赋值为255memset(lpDst,255,3);}}}}else{AfxMessageBox("只支持256色和真彩色位图");//释放内存GlobalUnlock(hDIB);GlobalFree(hDIB);returnNULL;}//返回returnhDIB;}3.图像缩放(对话框自己建立)voidCCimageProcessingView::OnGeomZoom(){//TODO:Addyourcommandhandlercodehere//图像缩放//获取文档CCimageProcessingDoc*pDoc=GetDocument();//指向DIB的指针LPSTRlpDIB;//锁定DIBlpDIB=(LPSTR)::GlobalLock((HGLOBAL)pDoc->GetHDIB());//缩放比率floatfXZoomRatio;floatfYZoomRatio;//创建对话框CDlgGeoZoomdlgPara;//初始化变量值dlgPara.m_XZoom=0.5;dlgPara.m_YZoom=0.5;//显示对话框,提示用户设定平移量if(dlgPara.DoModal()!=IDOK){//返回return;}//获取用户设定的平移量fXZoomRatio=dlgPara.m_XZoom;fYZoomRatio=dlgPara.m_YZoom;//删除对话框deletedlgPara;//创建新DIBHDIBhNewDIB=NULL;//更改光标形状BeginWaitCursor();//调用ZoomDIB()函数转置DIBhNewDIB=(HDIB)ZoomDIB(lpDIB,fXZoomRatio,fYZoomRatio);//判断缩放是否成功if(hNewDIB!=NULL){//替换DIB,同时释放旧DIB对象pDoc->ReplaceHDIB(hNewDIB);//更新DIB大小和调色板pDoc->InitDIBData();//设置脏标记pDoc->SetModifiedFlag(TRUE);//重新设置滚动视图大小SetScrollSizes(MM_TEXT,pDoc->GetDocSize());//更新视图pDoc->UpdateAllViews(NULL);}else{//提示用户MessageBox("分配内存失败!","系统提示",MB_ICONINFORMATION|MB_OK);}//解除锁定::GlobalUnlock((HGLOBAL)pDoc->GetHDIB());//恢复光标EndWaitCursor();}/***************************************************************************函数名称:*ZoomDIB()**参数:*LPSTRlpDIB-指向源DIB的指针*floatfXZoomRatio-X轴方向缩放比率*floatfYZoomRatio-Y轴方向缩放比率**返回值:*HGLOBAL-缩放成功返回新DIB句柄,否则返回NULL。**说明:*该函数用来缩放DIB图像,返回新生成DIB的句柄。*************************************************************************/HGLOBALWINAPIZoomDIB(LPSTRlpDIB,floatfXZoomRatio,floatfYZoomRatio){//源图像的宽度和高度LONGlWidth;LONGlHeight;//缩放后图像的宽度和高度LONGlNewWidth;LONGlNewHeight;WORDwNumColors;//缩放后图像的宽度(lNewWidth',必须是4的倍数)LONGlNewLineBytes;//指向源图像的指针LPBYTElpDIBBits;//指向源象素的指针LPBYTElpSrc;//缩放后新DIB句柄HDIBhDIB;//指向缩放图像对应象素的指针LPBYTElpDst;//指向缩放图像的指针LPSTRlpNewDIB;LPBYTElpNewDIBBits;//指向BITMAPINFO结构的指针(Win3.0)LPBITMAPINFOHEADERlpbmi,lpbmi0;//指向BITMAPCOREINFO结构的指针LPBITMAPCOREHEADERlpbmc;//循环变量(象素在新DIB中的坐标)LONGi;LONGj;//象素在源DIB中的坐标LONGi0;LONGj0;//图像每行的字节数LONGlLineBytes;//找到源DIB图像象素起始位置lpDIBBits=(LPBYTE)::FindDIBBits(lpDIB);//获取图像的宽度lWidth=::DIBWidth(lpDIB);//获取图像的高度lHeight=::DIBHeight(lpDIB);wNumColors=
lpSrc=(LPBYTE)lpDIBBits+lLineBytes*(lHeight-1-i0)+3*j0;
memcpy(lpDst,lpSrc,3);
memset(lpDst,255,3);
GlobalUnlock(hDIB);
GlobalFree(hDIB);
returnhDIB;
3.图像缩放(对话框自己建立)
OnGeomZoom()
//TODO:
Addyourcommandhandlercodehere
//图像缩放
//获取文档
floatfXZoomRatio;
floatfYZoomRatio;
CDlgGeoZoomdlgPara;
dlgPara.m_XZoom=0.5;
dlgPara.m_YZoom=0.5;
//显示对话框,提示用户设定平移量
fXZoomRatio=dlgPara.m_XZoom;
fYZoomRatio=dlgPara.m_YZoom;
//更改光标形状
//调用ZoomDIB()函数转置DIB
hNewDIB=(HDIB)ZoomDIB(lpDIB,fXZoomRatio,fYZoomRatio);
//判断缩放是否成功
if(hNewDIB!
=NULL)
//替换DIB,同时释放旧DIB对象
//更新DIB大小和调色板
//设置脏标记
//重新设置滚动视图大小
//更新视图
//提示用户
MessageBox("分配内存失败!
","系统提示",MB_ICONINFORMATION|MB_OK);
//恢复光标
/*************************************************************************
*ZoomDIB()
*LPSTRlpDIB-指向源DIB的指针
*floatfXZoomRatio-X轴方向缩放比率
*floatfYZoomRatio-Y轴方向缩放比率
*HGLOBAL-缩放成功返回新DIB句柄,否则返回NULL。
*该函数用来缩放DIB图像,返回新生成DIB的句柄。
HGLOBALWINAPIZoomDIB(LPSTRlpDIB,floatfXZoomRatio,floatfYZoomRatio)
//源图像的宽度和高度
//缩放后图像的宽度和高度
//缩放后图像的宽度(lNewWidth',必须是4的倍数)
//指向源图像的指针
//指向源象素的指针
LPBYTElpSrc;
//缩放后新DIB句柄
//指向缩放图像对应象素的指针
LPBYTElpDst;
//指向缩放图像的指针
//指向BITMAPINFO结构的指针(Win3.0)
//指向BITMAPCOREINFO结构的指针
LPBITMAPCOREHEADERlpbmc;
//循环变量(象素在新DIB中的坐标)
LONGj;
//象素在源DIB中的坐标
LONGi0;
LONGj0;
//找到源DIB图像象素起始位置
//获取图像的宽度
//获取图像的高度
wNumColors=
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1