资源描述:
《图片旋转任意角度.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、MFC中BMP图片旋转任意角度、用于绘制模拟时钟表针filepath为图片路径,angle为旋转角度。旋转以pCenter为中心进行旋转,并且pCenter将位于图片中心用于绘制模拟时钟表针voidCXXXXX::DrawBmp(CDC*pDC,CStringfilepath,doubleangle){ doubleSrcWidth=0;//图片宽度doubleSrcHeight=0;//图片高度 CFile file; //用于读取BMP文件 BITMAPFILEHEADER bfhHeade
2、r;//bmp文件头 BITMAPINFOHEADER bmiHeader; //bmp格式头 LPBITMAPINFO lpBitmapInfo; //bmp格式具体信息 if(!file.Open(filepath,CFile::modeRead)) return; //打开文件 file.Read(&bfhHeader,sizeof(BITMAPFILEHEADER));//读取文件头 if(bfhHeader.bfType!=0x4
3、d42) //判断是否是BM return; if(bfhHeader.bfSize!=file.GetLength()) return; if(file.Read((LPSTR)&bmiHeader,sizeof(bmiHeader))!=sizeof(bmiHeader)) return; SrcHeight = bmiHeader.biHeight;//得到高度和宽度 SrcWidth = bmiHeader.biWidth; file.SeekToBegin(); file.Re
4、ad(&bfhHeader,sizeof(BITMAPFILEHEADER)); UINT uBmpInfoLen=(UINT) bfhHeader.bfOffBits-sizeof(BITMAPFILEHEADER); lpBitmapInfo=(LPBITMAPINFO) new BYTE[uBmpInfoLen]; file.Read((LPVOID) lpBitmapInfo,uBmpInfoLen); if((* (LPDWORD)(lpBitmapInfo))!=sizeof(BITMAPINF
5、OHEADER)) return; DWORD dwBitlen=bfhHeader.bfSize - bfhHeader.bfOffBits; LPVOID lpSrcBits=new BYTE[dwBitlen];//将数据读入lpSrcBits数组 file.Read(lpSrcBits,dwBitlen); file.Close();//关闭文件 CDCbmpDC;bmpDC.CreateCompatibleDC(pDC);CBitmapbmp;bmp.CreateCompatibleBitmap
6、(pDC,SrcWidth,SrcHeight);bmpDC.SelectObject(&bmp); StretchDIBits(bmpDC.m_hDC,0,0,SrcWidth,SrcHeight,0,0,bmiHeader.biWidth,bmiHeader.biHeight,lpSrcBits,lpBitmapInfo,DIB_RGB_COLORS,MERGECOPY); //StretchDIBits不能去掉。将图片贴到bmpDC中 doublex1,x2,x3; doubley1,y2,y3; d
7、oublemaxWidth,maxHeight,minWidth,minHeight; doublesrcX,srcY; doublesinA,cosA; doubleDstWidth; doubleDstHeight; angle=angle/180.0*3.14159265;sinA=sin(angle); cosA=cos(angle); x1=SrcWidth*cosA;y1=SrcWidth*sinA;x2=SrcWidth*cosA-SrcHeight*sinA;y2=SrcWidth*sin
8、A+SrcHeight*cosA;x3=-SrcHeight*sinA;y3=SrcHeight *cosA;minWidth=x3>(x1>x2?x2:x1)?(x1>x2?x2:x1):x3; minWidth=minWidth>0?0:minWidth; minHeight=y3>(y1>y2?y2:y1)?(y1>y2?y2:y1):y3; minHeight=minHeight>0?0: