純C影象旋轉90、180、270度
純C影象旋轉90、180、270度。
/**
* @desc 灰度影象旋轉90
* @param psrc 原影象
* @param sw 原影象寬度
* @param sh 原影象高度
* @param pdst 目標影象
* @param dw 目標影象寬度
* @param dh 目標影象高度
**/
void imgRotate90Gray(unsigned char *psrc,int sw,int sh,unsigned char *pdst,int *dw,int *dh)
{
int i,j,dw1;
unsigned char *p,*q;
*dw = sh;
*dh = sw;
dw1 = *dw-1;
p = psrc;
q = pdst;
for(i=0;i<(*dh);i++){
for(j=0;j<(*dw);j++){
*q++ = p[(dw1-j)*(*dh)+i];
}
}
}
/**
* @desc 彩色影象旋轉90(RGB888)
* @param psrc 原影象
* @param sw 原影象寬度
* @param sh 原影象高度
* @param pdst 目標影象
* @param dw 目標影象寬度
* @param dh 目標影象高度
**/
void imgRotate90Color(unsigned char *psrc,int sw,int sh,unsigned char *pdst,int *dw,int *dh)
{
int i=0,j=0,bytePerLine,dw1,tmp,i3;
unsigned char *p,*q;
*dw = sh;
*dh = sw;
bytePerLine = *dh*3;
dw1 = *dw-1;
p = psrc;
q = pdst;
for(i=0;i<(*dh);i++){
i3 = i*3;
for(j=0;j<(*dw);j++){
tmp = (dw1-j)*bytePerLine+i3;
*q++ = p[tmp];
*q++ = p[tmp+1];
*q++ = p[tmp+2];
}
}
}
/**
* @desc 灰階影象旋轉270
* @param psrc 原影象
* @param sw 原影象寬度
* @param sh 原影象高度
* @param pdst 目標影象
* @param dw 目標影象寬度
* @param dh 目標影象高度
**/
void imgRotate270Gray(unsigned char *psrc,int sw,int sh,unsigned char *pdst,int *dw,int *dh)
{
int i=0,j=0,tmp,dh1;
unsigned char *p,*q;
*dw = sh;
*dh = sw;
dh1 = sw-1;
p = psrc;
q = pdst;
for(i=0;i<(*dh);i++){
tmp = dh1-i;
for(j=0;j<(*dw);j++){
*q++ = p[j*(*dh)+tmp];
}
}
}
/**
* @desc 彩色影象旋轉270(RGB888)
* @param psrc 原影象
* @param sw 原影象寬度
* @param sh 原影象高度
* @param pdst 目標影象
* @param dw 目標影象寬度
* @param dh 目標影象高度
**/
void imgRotate270Color(unsigned char *psrc,int sw,int sh,unsigned char *pdst,int *dw,int *dh)
{
int i=0,j=0,tmp1 = 0,tmp2=0,dh3,dh31;
unsigned char *p,*q;
*dw = sh;
*dh = sw;
dh3 = sw*3,dh31 = sw*3-1;
p = psrc;
q = pdst;
tmp1 = dh31;
for(i=0;i<(*dh);i++){
tmp1 -= 3;
tmp2 = 0;
for(j=0;j<(*dw);j++){
tmp2+=dh3;
*q++ = p[tmp2+tmp1-2];
*q++ = p[tmp2+tmp1-1];
*q++ = p[tmp2+tmp1];
}
}
}
/**
* @desc 灰階影象旋轉180
* @param pimg 影象
* @param w 影象寬度
* @param h 影象高度
**/
void imgRotate180Gray(unsigned char *pimg,int w,int h)
{
unsigned char tmp;
int i=0,j=0;
unsigned char *t,*tt;
tt = pimg;
t = pimg + (w*h-1);
for(i=0;i<(h>>1);i++){
for(j=0;j tmp = *tt; *tt = *t; *t = tmp; tt++; t——; } } //如果影象高度是奇數 int halfH = h>>1; if(h%2 == 1){ for(i=0;i<(w>>1);i++){ tmp = pimg[halfH*w+i]; pimg[halfH*w+i] = pimg[halfH*w+w-1-i]; pimg[halfH*w+w-1-i] = tmp; } } } /** * @desc 彩色影象旋轉180(RGB888) * @param pimg 影象 * @param w 影象寬度 * @param h 影象高度 **/ void imgRotate180Color(unsigned char *pimg,int w,int h) { unsigned char tmp; int i=0,j=0,m=0,w3; unsigned char *t,*tt; w3 = w*3; tt = pimg; t = pimg + (w3*h-3); for(i=0;i<(h>>1);i++){ for(j=0;j for(m=0;m<3;m++){ tmp = *tt; *tt = *t; *t = tmp; ++tt; ++t; } t-=6; } } //如果影象高度是奇數 int halfH = h>>1; halfH*=w3; if(h%2 == 1){ for(i=0;i<(w3>>1);i+=3){ tmp = pimg[halfH+i]; pimg[halfH+i] = pimg[halfH+w3-3-i]; pimg[halfH+w3-3-i] = tmp; tmp = pimg[halfH+i+1]; pimg[halfH+i+1] = pimg[halfH+w3-2-i]; pimg[halfH+w3-2-i] = tmp; tmp = pimg[halfH+i+2]; pimg[halfH+i+2] = pimg[halfH+w3-1-i]; pimg[halfH+w3-1-i] = tmp; } } } /** * @desc 彩色影象R、B互換(RGB888) * @param pimg 影象 * @param w 影象寬度 * @param h 影象高度 **/ void imgRBExchange(unsigned char *pimg,int w,int h) { int i = 0,j=0; unsigned char tmp = 0; unsigned char *p; p = pimg; for (j=0;j for (i=0;i tmp = *p; *p = *(p+2); *(p+2) = tmp; p+=3; } } }