王涛 《基于ARM嵌入式图像处理系统设计与实现》 第19页 共28页
U16 namme[200]; U16 ch0={'1'};
char str2[]={'1','2','7','_','3','2',' ',' ','B','M','P',0}; U16 str1[]={'1','2','7','_','3','2',' ',' ','B','M','P',0}; U16 str3[17];
strChar2Unicode(namme,n2); //POSMSG pMsg;//消息定义
LCD_ChangeMode(DspGraMode);//转换LCD显示模式为文本显示模式 //LCD_Cls();//文本模式下清屏命令 //ClearScreen();
pdc=CreateDC(); ClearScreen(); for(;;)
{ int i,j,k,nbyte;
U32 cx,cy,wold,hold,wnew,hnew,x0,y0,x1,y1,oldx,oldy; U32 color;
U32 colorbuf[320][240];
FILE* pfile; U8 *pbmp,*bmpstart; static U8 bmp[4096];
float zoomRatio=2,num1;
INT8U err;
BITMAPFILEHEADER bmpfileheader; BITMAPINFOHEADER bmpinfoheader;
if((pfile=OpenOSFile(bmpname, FILEMODE_READ))==NULL)
return;
ReadOSFile(pfile, (U8*)bmp, 2);
// if((bmp[0]&0xffff)!='MB' ) //不是bmp文件
if(bmp[0]!='B' ||bmp[1] !='M')
王涛 《基于ARM嵌入式图像处理系统设计与实现》 第20页 共28页
return;
num1=(float)(1.0/zoomRatio); ReadOSFile(pfile, sizeof(BITMAPFILEHEADER));
wold=bmpinfoheader.biWidth;
hold=bmpinfoheader.biHeight;
nbyte=bmpinfoheader.biBitCount/8;//第x行,第y列
ReadOSFile(pfile, (U8*)&bmpinfoheader, sizeof(BITMAPINFOHEADER));
(U8*)&bmpfileheader,
x0=0; y0=hold-1;
//缩放的关键问题是:在对一副图片进行缩放时,可能用到上一次读入的行象素值,然而,readosfile()函数
//每读一次就向前推进,故必须标记读入时机《使用oldx oldy》 oldx=x0; oldy=y0; num1=1; bmpstart=bmp; pbmp=bmp; for(i=hold-1;i>=0;i--) {pbmp=bmp;
if(!ReadOSFile(pfile, bmp,wold*nbyte+((wold*nbyte)%2)))
break;
for(j=0;j for(k=0;k color|=*pbmp; } 王涛 《基于ARM嵌入式图像处理系统设计与实现》 第21页 共28页 pbmp++; colorbuf[i][j]=color;}} num1=(float)(1.0/zoomRatio); wnew = (U32)(wold*zoomRatio+0.5); hnew = (U32)(hold*zoomRatio+0.5); for(y1=0;y1 for(x1=0;x1 {x0= (U32)(x1*num1); y0= (U32)(y1*num1); SetPixel(pdc,y1,x1,colorbuf[x0][y0]);} ///////////////////////////////////////// CloseOSFile(pfile); OSTimeDly(200);//主任务挂起200毫秒}} 5.5 转置图像主要代码 void Main_Task(void *Id) //Main_Test_Task {char bmpname[12]={'1','2','7','_','3','2',' ',' ','B','M','P',0}; int i=0,status=0,j=0; PDC pdc; char n2[]=\U16 namme[200]; U16 ch0={'1'}; char str2[]={'1','2','7','_','3','2',' ',' ','B','M','P',0}; U16 str1[]={'1','2','7','_','3','2',' ',' ','B','M','P',0}; U16 str3[17]; strChar2Unicode(namme,n2); LCD_ChangeMode(DspGraMode);//转换LCD显示模式为文本显示模式 pdc=CreateDC(); ClearScreen(); 王涛 《基于ARM嵌入式图像处理系统设计与实现》 第22页 共28页 for(;;) {int i,j,k,nbyte; U32 cx,cy; U32 color; FILE* pfile; U8 *pbmp; static U8 bmp[4096]; INT8U err; BITMAPFILEHEADER bmpfileheader; BITMAPINFOHEADER bmpinfoheader; if((pfile=OpenOSFile(bmpname, FILEMODE_READ))==NULL) return; ReadOSFile(pfile, (U8*)bmp, 2); if(bmp[0]!='B' ||bmp[1] !='M') return; ReadOSFile(pfile, (U8*)&bmpfileheader, sizeof(BITMAPFILEHEADER)); ReadOSFile(pfile, (U8*)&bmpinfoheader, sizeof(BITMAPINFOHEADER)); cx=bmpinfoheader.biWidth; cy=bmpinfoheader.biHeight; nbyte=bmpinfoheader.biBitCount/8; //OSSemPend(Lcd_Disp_Sem, 0, &err); for(i=cy-1;i>=0;i--){ pbmp=bmp; if(!ReadOSFile(pfile, bmp,cx*nbyte+((cx*nbyte)%2))) break; for(j=0;j for(k=0;k color|=*pbmp; } pbmp++; SetPixel(pdc,i, j, color);}} CloseOSFile(pfile); OSTimeDly(200);//主任务挂起200毫秒}}