大家帮忙看看这个位图旋转函数。

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();

}
...全文
140 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhoujk 2011-04-26
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ok132 的回复:]
引用 6 楼 zhoujk 的回复:
你到我的资源去下载一个,双插值算法的图像旋转,就没有这个问题

你的资源那个函数能不能在MFC里实现的?
[/Quote]
不行,你要拿到以后自己去改
fengbingchun 2011-04-20
  • 打赏
  • 举报
回复
用opencv吧,里面有cv2DRotationMatrix和cvWarpAffine函数可以实现图像的任意角度的旋转
baoyz 2011-04-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ok132 的回复:]
引用 2 楼 hdt 的回复:
浮点数计算肯定有误差,用gdi+

能不能提供点意见?GDI+不能旋转任意角度?
[/Quote]

我不知道阁下的结论是怎么来的。不过我可以100%的保证GDI+绝对能做到任意角度的旋转。
不能用旋转函数,应该使用GDI+的三点式画图法贴图——即左上点,右上点,左下点。不用我多说了吧?
无水先生 2011-04-19
  • 打赏
  • 举报
回复
要保证长\宽一样长才能,否则,再开一个图像
OK132 2011-04-19
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zhoujk 的回复:]
你到我的资源去下载一个,双插值算法的图像旋转,就没有这个问题
[/Quote]
你的资源那个函数能不能在MFC里实现的?
zhoujk 2011-04-19
  • 打赏
  • 举报
回复
你到我的资源去下载一个,双插值算法的图像旋转,就没有这个问题
真相重于对错 2011-04-18
  • 打赏
  • 举报
回复
Graphics* g = Graphics.FromImage( ... )
g.RotateTransform
winning11xuhao 2011-04-18
  • 打赏
  • 举报
回复
贴一下图看看
OK132 2011-04-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hdt 的回复:]
浮点数计算肯定有误差,用gdi+
[/Quote]
能不能提供点意见?GDI+不能旋转任意角度?
真相重于对错 2011-04-18
  • 打赏
  • 举报
回复
浮点数计算肯定有误差,用gdi+
OK132 2011-04-18
  • 打赏
  • 举报
回复
up!!!!怎么现在论坛都没人来回答呀??

679

社区成员

发帖
与我相关
我的任务
社区描述
智能路由器通常具有独立的操作系统,包括OpenWRT、eCos、VxWorks等,可以由用户自行安装各种应用,实现网络和设备的智能化管理。
linuxpython 技术论坛(原bbs)
社区管理员
  • 智能路由器社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧