1# 图像旋转的代码,网上很多都不好用,自己研究了一下,把代码记录下来
// 逆时针 90 度
// src 图像数据
// srcW 图像宽度
// srcH 图像高度
// channel 图像通道,如果是RGB,BGR,=3, RGBA = 4,GRAY=1
//注意旋转90 后,图像数据的宽高会对调,显示时候自己注意
int RotationLeft90Ex(unsigned char* src, int srcW, int srcH, int channel)
{
unsigned char* tempSrc = NULL;
int srcLineBytes = 0;
srcLineBytes = (srcW * channel + 3) / 4 * 4;
int mSize = srcLineBytes * srcH;// *sizeof(char)* channel;
int destLineBytes = (srcH * channel + 3) / 4 * 4;
int i = 0;
int j = 0;
int k = 0;
int desW = 0;
int desH = 0;
desW = srcH;
desH = srcW;
tempSrc = (unsigned char*)malloc(srcLineBytes * srcH );
memcpy(tempSrc, src, mSize);
for (i = 0; i < desH; i++)
{
for (j = 0; j < desW; j++)
{
for (k = 0; k < channel; k++)
{
src[(i * destLineBytes) + j * channel + k] = tempSrc[ (srcH -j-1) * srcLineBytes + i * channel + k];
//src[(i * desW + j) * channel + k] = tempSrc[(srcH * srcW - (j + 1) * srcW + i) * channel + k]; //multi channels
//src[i * desW + j] = tempSrc[srcH * srcW - (j+1) * srcW + i]; //tempSrc[(srcH - 1 - j) * srcW + i]; //8 bit single channel
}
}
}
free(tempSrc);
return 0;
}
// 顺时针 90 度
// src 图像数据
// srcW 图像宽度
// srcH 图像高度
// channel 图像通道,如果是RGB,BGR,=3, RGBA = 4,GRAY=1
//注意旋转90 后,图像数据的宽高会对调,显示时候自己注意
int RotationRight90Ex(unsigned char* src, int srcW, int srcH, int channel)
{
unsigned char* tempSrc = NULL;
int srcLineBytes = 0;
srcLineBytes = (srcW * channel + 3) / 4 * 4;
int mSize = srcLineBytes * srcH;// *sizeof(char)* channel;
int destLineBytes = (srcH * channel + 3) / 4 * 4;
int i = 0;
int j = 0;
int k = 0;
int desW = 0;
int desH = 0;
desW = srcH;
desH = srcW;
tempSrc = (unsigned char*)malloc(srcLineBytes * srcH);
memcpy(tempSrc, src, mSize);
for (i = 0; i < desH; i++)
{
for (j = 0; j < desW; j++)
{
for (k = 0; k < channel; k++)
{
src[((desH - i - 1) * destLineBytes) + j * channel + k] = tempSrc[j * srcLineBytes + i * channel + k];
//src[(i * desW + j) * channel + k] = tempSrc[(srcH * srcW - (j + 1) * srcW + i) * channel + k]; //multi channels
//src[i * desW + j] = tempSrc[srcH * srcW - (j+1) * srcW + i]; //tempSrc[(srcH - 1 - j) * srcW + i]; //8 bit single channel
}
}
}
free(tempSrc);
return 0;
}
// X轴翻转
// src 图像数据
// srcW 图像宽度
// srcH 图像高度
// channel 图像通道,如果是RGB,BGR,=3, RGBA = 4,GRAY=1
int FlipX(unsigned char* src, int srcW, int srcH, int channel)
{
unsigned char* tempSrc = NULL;
int srcLineBytes = 0;
srcLineBytes = (srcW * channel + 3) / 4 * 4;
int mSize = srcLineBytes * srcH;// *sizeof(char)* channel;
int destLineBytes = (srcW * channel + 3) / 4 * 4;
int i = 0;
int j = 0;
int k = 0;
int desW = 0;
int desH = 0;
desW = srcW;
desH = srcH;
tempSrc = (unsigned char*)malloc(srcLineBytes * srcH);
memcpy(tempSrc, src, mSize);
for (i = 0; i < desH; i++)
{
for (j = 0; j < desW; j++)
{
for (k = 0; k < channel; k++)
{
//src[(i * desW + j) * channel + k] = tempSrc[(i * srcW + srcW - j - 1) * channel +k];
src[(i * destLineBytes )+ j * channel + k] = tempSrc[i * srcLineBytes + (srcW - j) * channel + k];
}
}
}
free(tempSrc);
return 0;
}
// Y轴翻转
// src 图像数据
// srcW 图像宽度
// srcH 图像高度
// channel 图像通道,如果是RGB,BGR,=3, RGBA = 4,GRAY=1
int FlipY(unsigned char* src, int srcW, int srcH, int channel)
{
unsigned char* tempSrc = NULL;
int srcLineBytes = 0;
srcLineBytes = (srcW * channel + 3) / 4 * 4;
int mSize = srcLineBytes * srcH;// *sizeof(char)* channel;
int destLineBytes = (srcW * channel + 3) / 4 * 4;
int i = 0;
int j = 0;
int k = 0;
int desW = 0;
int desH = 0;
desW = srcW;
desH = srcH;
tempSrc = (unsigned char*)malloc(srcLineBytes * srcH);
memcpy(tempSrc, src, mSize);
for (i = 0; i < desH; i++)
{
for (j = 0; j < desW; j++)
{
for (k = 0; k < channel; k++)
{
//src[(i * desW + j) * channel + k] = tempSrc[((srcH-(i+1)) * srcW + j) * channel + k];
src[(i * destLineBytes )+ j * channel + k] = tempSrc[((srcH - (i + 1)) * srcLineBytes) + j * channel + k];
}
}
}
free(tempSrc);