硬件准备
ADSP-EDU-BF533:BF533开发板
 AD-HP530ICE:ADI DSP仿真器
软件准备
Visual DSP++软件
硬件链接

功能介绍
代码实现了图像旋转处理,代码运行时,会通过文件系统打开工程文件根目下" …/ImageView"路径中的 testin.bmp 文件,进行图像旋转处理后把图片保存到工程文件根目下" …/ImageView"路径中的 testout.bmp 文件,并且将处理后的图片显示到液晶屏上。例子中的算法只支持尺寸为 480*272 的 24bit 的 bmp 图片,可以根据自己的需要自行调整。
代码使用说明
funct.c 中的 RotateImage(BMPIMAGE *img,int iRotateAngle)
 该函数是将读取的图像进行旋转处理。
BMPIMAGE * 图像结构体指针
 int iRotateAngle 旋转的角度,逆时针旋转,本例子程序只支持以下角度的旋转{0,30,45,60,90,120,135,150,180,210,225,240,270,300,315,330,360}
 在 main.c 文件中定义了一个#define LCD_VIEW_ENABLE 宏开关,如果不需要将处理后的图片显示在液晶屏上,只需将这个宏开关注释掉。
代码实验步骤
- 将工程文件根目下的 ImageView 文件夹内存放一个名为 testin.bmp 的图像文件,该文件尺寸为 480*272 的24bit 的 bmp 图片(默认已存一幅测试图片)。
- 打开工程文件 BF53x_Rotation.dpj,编译并运行代码
- 等待图像处理,处理完成之后会在液晶屏上显示处理后的图片,并在工程文件根目下的 ImageView 文件夹内生成一个处理后名为 testout.bmp 图片。
代码实验结果
 1.液晶屏上显示处理后的图片。
 2.在工程文件根目下的 ImageView 文件夹中查看处理后名为 testout.bmp 图片。
程序源码
#include “bmp.h” 
 #include “math.h”
#define PI 3.14159
 //角度到弧度转化的宏
 #define RADIAN(angle) ((angle)*PI/180.0)
/********************************************************
- 函数名 : RotateImage
- 函数功能 : 图像旋转处理
-  
  -  
   
    函数参数 : BMPIMAGE * 图像结构体指针
    
   
- int iRotateAngle 旋转的角度
 
- 函数返回值 :FALSE 处理失败
-  TRUE 处理成功
********************************************************/
 int RotateImage(BMPIMAGE *img,int iRotateAngle)
 {
 // 指向源象素的指针
 unsigned char *lpSrc; 
 // 指向旋转图像对应象素的指针
 unsigned char *lpDst; 
 // 图像的宽度和高度
 long lWidth;
 long lHeight;
 // 旋转后图像的宽度和高度
 long lNewWidth;
 long lNewHeight; 
 // 图像每行的字节数
 long lLineBytes;
// 旋转后图像的宽度(lNewWidth',必须是4的倍数)
long	lNewLineBytes;
lWidth = img->infohead.BiWidth;
lHeight = img->infohead.BiHeight;
lLineBytes= WIDTHBYTES(lWidth * 24);
unsigned char *lpDIBBits = img->imgbuf;
unsigned char *lpNewDIBBits;	// 循环变量(象素在新DIB中的坐标)	
// 象素在新DIB中的坐标
long	i;
long	j;
unsigned char     k=0;
unsigned char	temp;
// 象素在源DIB中的坐标
long	i0;
long	j0;
// 旋转角度(弧度)
float	fRotateAngle;
// 旋转角度的正弦和余弦
float	fSina, fCosa;
// 源图四个角的坐标(以图像中心为坐标系原点)
float	fSrcX1,fSrcY1,fSrcX2,fSrcY2,fSrcX3,fSrcY3,fSrcX4,fSrcY4;
// 旋转后四个角的坐标(以图像中心为坐标系原点)
float	fDstX1,fDstY1,fDstX2,fDstY2,fDstX3,fDstY3,fDstX4,fDstY4;
// 两个中间常量
float	f1,f2;
// 将旋转角度从度转换到弧度
fRotateAngle = (float) RADIAN(iRotateAngle);
// 计算旋转角度的正弦
fSina = (float) sin((double)fRotateAngle);
// 计算旋转角度的余弦
fCosa = (float) cos((double)fRotateAngle);
if(iRotateAngle%90==0)
{
	temp = 0;
}
else
{
	temp = 1;
}	
// 计算原图的四个角的坐标(以图像中心为坐标系原点)
fSrcX1 = (float) (- (lWidth-temp  ) / 2);
fSrcY1 = (float) (  (lHeight-temp ) / 2);
fSrcX2 = (float) (  (lWidth-temp  ) / 2);
fSrcY2 = (float) (  (lHeight-temp ) / 2);
fSrcX3 = (float) (- (lWidth-temp  ) / 2);
fSrcY3 = (float) (- (lHeight-temp ) / 2);
fSrcX4 = (float) (  (lWidth-temp  ) / 2);
fSrcY4 = (float) (- (lHeight-temp ) / 2);
// 计算新图四个角的坐标(以图像中心为坐标系原点)
fDstX1 =  fCosa * fSrcX1 + fSina * fSrcY1;
fDstY1 = -fSina * fSrcX1 + fCosa * fSrcY1;
fDstX2 =  fCosa * fSrcX2 + fSina * fSrcY2;
fDstY2 = -fSina * fSrcX2 + fCosa * fSrcY2;
fDstX3 =  fCosa * fSrcX3 + fSina * fSrcY3;
fDstY3 = -fSina * fSrcX3 + fCosa * fSrcY3;
fDstX4 =  fCosa * fSrcX4 + fSina * fSrcY4;
fDstY4 = -fSina * fSrcX4 + fCosa * fSrcY4;
// 计算旋转后的图像实际宽度
lNewWidth  = (long) ( max( fabs(fDstX4 - fDstX1), fabs(fDstX3 - fDstX2) ) + 0.5);
// lNewLineBytes = (long) ( max( fabs((fDstX4 - fDstX1)*3), fabs((fDstX3 - fDstX2)3) ) + 0.5);
 // 计算新图像每行的字节数
 lNewLineBytes = WIDTHBYTES(lNewWidth * 83);
// 计算旋转后的图像高度
lNewHeight = (long) ( max( fabs(fDstY4 - fDstY1), fabs(fDstY3 - fDstY2) )  + 0.5);
// 两个常数,这样不用以后每次都计算了
f1 = (float) (-0.5 * (lNewWidth - 1) * fCosa - 0.5 * (lNewHeight - 1) * fSina
	+ 0.5 * (lWidth  - 1));
f2 = (float) ( 0.5 * (lNewWidth - 1) * fSina - 0.5 * (lNewHeight - 1) * fCosa
	+ 0.5 * (lHeight - 1));
lpNewDIBBits = (unsigned char*)malloc(lNewLineBytes*lNewHeight);
if(lpNewDIBBits == NULL)
		return FALSE;
// 针对图像每行进行操作
	for(i = 0; i < lNewHeight; i++)
{
	// 针对图像每列进行操作
	for(j = 0; j < lNewWidth; j++)
	{
		for(k=0;k<3;k++)
			{
			// 指向新DIB第i行,第j个象素的指针
			// 注意此处宽度和高度是新DIB的宽度和高度
			lpDst = (char *)lpNewDIBBits + lNewLineBytes * (lNewHeight - 1 - i) + j*3+k;
		
			// 计算该象素在源DIB中的坐标
			i0 = (long) (-((float) (j)) * fSina + ((float) i) * fCosa + f2 + 0.5);
			j0 = (long) ( ((float) (j)) * fCosa + ((float) i) * fSina + f1 + 0.5);
		
			// 判断是否在源图范围内
			if( (j0 >= 0) && (j0 < lWidth) && (i0 >= 0) && (i0 < lHeight))
			{
					// 指向源DIB第i0行,第j0个象素的指针
					lpSrc = (char *)lpDIBBits + lLineBytes * (lHeight - 1 - i0) + j0*3+k;
			
					// 复制象素
					*lpDst = *lpSrc;
			}
			else
			{
				// 对于源图中没有的象素,直接赋值为255
				* ((unsigned char*)lpDst) =122;
			}
		}
	}
}		
free(img->imgbuf);
img->imgbuf = lpNewDIBBits;
img->infohead.BiWidth = lNewWidth;
img->infohead.BiHeight = lNewHeight;
img->imagesize = lNewLineBytes*lNewHeight;
	// 返回
return TRUE;
}















![[附源码]Node.js计算机毕业设计电子市场计算机配件报价系统Express](https://img-blog.csdnimg.cn/9c6e1954f5694beeb0fd624374ed6012.png)


