大家帮忙看看这个位图旋转函数。
OK132 2011-04-18 04:24:48 我在网上找到了一个,但是在旋转除了90,180,270,360度以外的度数时图片中有部分会出现一个个黑色的像素点,谁能帮忙看看是为什么?可以修改一下吗?我不想旋转完之后图片失真。
void CMyView::RotateBitmap(CDC *pDC, CBitmap &bitmap, int x, int y, int theta)
{
CBitmap *pOldSourceBitmap,*pOldDestBitmap,bitmapDest;
CDC MemSrcDC,MemDestDC;
int height,width;
int i,j;
BITMAP bmp;
#define PI 3.1415926
double angle=(double)theta/10.0*PI/180.0;
double anglecos=cos(angle);
double anglesin=sin(angle);
int px,py;
MemSrcDC.CreateCompatibleDC(pDC);
MemDestDC.CreateCompatibleDC(pDC);
bitmap.GetObject(sizeof(BITMAP),&bmp);
width=bmp.bmWidth;
height=bmp.bmHeight;
int x1=(int)(-(double)height*anglesin);
int y1=(int)((double)height*anglecos);
int x2=(int)((double)width*anglecos-(double)height*anglesin);
int y2=(int)((double)height*anglecos+(double)width*anglesin);
int x3=(int)((double)width*anglecos);
int y3=(int)((double)width*anglesin);
int minx=min(0,min(x1,min(x2,x3)));
int miny=min(0,min(y1,min(y2,y3)));
int maxx=max(x1,max(x2,x3));
int maxy=max(y1,max(y2,y3));
int w=maxx-minx;
int h=maxy-miny;
bitmapDest.CreateBitmap(w,h,bmp.bmPlanes,bmp.bmBitsPixel,NULL);
pOldSourceBitmap=MemSrcDC.SelectObject(&bitmap);
pOldDestBitmap=MemDestDC.SelectObject(&bitmapDest);
for(i=0;i<width;++i)
for(j=0;j<height;++j)
{
px=(int)((double)i*anglecos-(double)j*anglesin)-minx;
py=(int)((double)i*anglesin+(double)j*anglecos)-miny;
MemDestDC.SetPixelV(px,py,MemSrcDC.GetPixel(i,j));
}
pDC->BitBlt(x,y,w,h,&MemDestDC,0,0,SRCCOPY);
MemSrcDC.SelectObject(pOldSourceBitmap);
MemDestDC.SelectObject(pOldDestBitmap);
MemDestDC.DeleteDC();
MemSrcDC.DeleteDC();
}