VC6.0图形处理5--几何变换

源码下载:http://download.csdn.net/detail/renshengrumenglibing/3875522

//注意如何申请新的存储空间,存放处理后的图片,并利用memcpy,将数据copy给原来存储图像的结构


void CBMPViewerDoc::OnMenuitem32788() //缩小变换

{
// TODO: Add your command handler code here
int linewidth;
linewidth=(pbi->bmiHeader.biWidth*pbi->bmiHeader.biBitCount+31)/32*4;
int i0 , j0;
double ratio = 0.5;

//申请存储空间,并返回指针给lpTemp

HLOCAL hTemp;

hTemp = LocalAlloc(LHND ,linewidth * bi.biHeight );
LPSTR lpTemp;

lpTemp = (char*)LocalLock(hTemp);



unsigned char *lpScr;
unsigned char * lpDest;
// TODO: Add your command handler code here
for(int i = 0 ; i< bi.biHeight ; i++){
for(int j = 0 ; j< bi.biWidth ; j++){
lpDest = (unsigned char *)lpTemp+linewidth*(bi.biHeight - i -1) + j;
i0 = (LONG)(i /ratio +0.5);
j0 = (LONG)(j /ratio + 0.5);
if((i0 >= 0) && (i0 < bi.biHeight)&&(j0 >= 0 ) && (j0 < bi.biWidth)){
lpScr = (unsigned char *)lpBuf+linewidth*(bi.biHeight - i0 -1) + j0;
*lpDest = *lpScr;
}

else {
*lpDest = 255;
}
}

}
memcpy(lpBuf, lpTemp, linewidth * bi.biHeight);
// Invalidata(TRUE);
UpdateAllViews(NULL,0,NULL);

}


void CBMPViewerDoc::OnMenuitem32789() //放大变换
//只能实现图像区域不变的放大,还不能改变图像的大小
{
// TODO: Add your command handler code here


int linewidth;
linewidth=(pbi->bmiHeader.biWidth*pbi->bmiHeader.biBitCount+31)/32*4;
int i0 , j0;
double ratio = 2; //放大倍数
HLOCAL hTemp;
hTemp = LocalAlloc(LHND ,linewidth * bi.biHeight );

LPSTR lpTemp;
lpTemp = (char*)LocalLock(hTemp);
unsigned char *lpScr;
unsigned char * lpDest;
// TODO: Add your command handler code here
for(int i = 0 ; i< bi.biHeight ; i++){
for(int j = 0 ; j< bi.biWidth ; j++){
lpDest = (unsigned char *)lpTemp+linewidth*(bi.biHeight - i -1) + j;
i0 = (LONG)(i /ratio +0.5);
j0 = (LONG)(j /ratio + 0.5);
if((i0 >= 0) && (i0 < bi.biHeight)&&(j0 >= 0 ) && (j0 < bi.biWidth)){
lpScr = (unsigned char *)lpBuf+linewidth*(bi.biHeight - i0 -1) + j0;
*lpDest = *lpScr;
}

else {
*lpDest = 255;
}
}

}
memcpy(lpBuf, lpTemp, linewidth * bi.biHeight);
// Invalidata(TRUE);
UpdateAllViews(NULL,0,NULL);

}


void CBMPViewerDoc::OnMenuitem32784() //旋转变换
{
// TODO: Add your command handler code here
int linewidth;
linewidth=(pbi->bmiHeader.biWidth*pbi->bmiHeader.biBitCount+31)/32*4;
int i0 , j0;
double RotateAngle = 15; //旋转角度

double piRotateAngle = RotateAngle * PI/180;


HLOCAL hTemp;
hTemp = LocalAlloc(LHND ,linewidth * bi.biHeight );

LPSTR lpTemp;
lpTemp = (char*)LocalLock(hTemp);
unsigned char *lpScr;
unsigned char * lpDest;
// TODO: Add your command handler code here
for(int i = 0 ; i< bi.biHeight ; i++){
for(int j = 0 ; j< bi.biWidth ; j++){
lpDest = (unsigned char *)lpTemp+linewidth*(bi.biHeight - i -1) + j;

i0 = (LONG)(cos(piRotateAngle) * i- sin(piRotateAngle) *j + 0.5);
j0 = (LONG)(sin(piRotateAngle) *i + cos(piRotateAngle) * j +0.5);

if((i0 >= 0) && (i0 < bi.biHeight)&&(j0 >= 0 ) && (j0 < bi.biWidth)){
lpScr = (unsigned char *)lpBuf+linewidth*(bi.biHeight - i0 -1) + j0;
*lpDest = *lpScr;
}

else {
*lpDest = 255;
}
}

}
memcpy(lpBuf, lpTemp, linewidth * bi.biHeight);
// Invalidata(TRUE);
UpdateAllViews(NULL,0,NULL);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值