图像旋转算法!

BeProfessional 2011-07-18 10:38:32
想做个类似时钟的画面,指针旋转时边缘会产生锯齿,指针用的png图片,请问有没有好的旋转算法?谢谢!

...全文
556 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhoujk 2011-07-20
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 beprofessional 的回复:]
引用 12 楼 zhoujk 的回复:
引用 2 楼 zhoujk 的回复:
到我的资源去下载一个图像旋转的类,双精度插值的。不过是用C#写的,你要用的话,要自己改一下

可以进行任意角度(双精度浮点值)的旋转


已经下了,但编译有点问题,已给你发了信息,希望帮忙解决,谢谢!
[/Quote]
没收到,可能CSDN也放暑假了,你EM我吧。zhoujqk@163.com
BeProfessional 2011-07-19
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 xianglitian 的回复:]
不就是用GDI+了
比如这个
http://www.vckbase.com/document/viewdoc/?id=1745
[/Quote]

谢谢,WINDOWS桌面环境用GDI+确实挺方便,但我的程序运行在嵌入式WINCE环境下,GDI+的旋转功能不能用。
向立天 2011-07-19
  • 打赏
  • 举报
回复
不就是用GDI+了
比如这个
http://www.vckbase.com/document/viewdoc/?id=1745
BeProfessional 2011-07-19
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 zhoujk 的回复:]
引用 2 楼 zhoujk 的回复:
到我的资源去下载一个图像旋转的类,双精度插值的。不过是用C#写的,你要用的话,要自己改一下

可以进行任意角度(双精度浮点值)的旋转
[/Quote]

已经下了,但编译有点问题,已给你发了信息,希望帮忙解决,谢谢!
向立天 2011-07-19
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 beprofessional 的回复:]

引用 14 楼 xianglitian 的回复:
不就是用GDI+了
比如这个
http://www.vckbase.com/document/viewdoc/?id=1745


谢谢,WINDOWS桌面环境用GDI+确实挺方便,但我的程序运行在嵌入式WINCE环境下,GDI+的旋转功能不能用。
[/Quote]
原来如此
那看看OpenCV的东西
他是开源的
而且效果也不错
ywwj5858792qd 2011-07-18
  • 打赏
  • 举报
回复
在GDI+中选择挺方便
liuli7786 2011-07-18
  • 打赏
  • 举报
回复
以前做过对一个位图进行旋转,代码如下,希望对你有所帮助 :

void MyPictureView::RightRotation()
{
CClientDC hDC(this);
dcSrc=CreateCompatibleDC(hDC);//得到一个内存设备环境
HDC MenHdc=CreateCompatibleDC(hDC);
SelectObject(dcSrc,hbmp);
BitBlt(dcSrc,0,0,bm.bmWidth,bm.bmHeight,MenHdc,0,0,SRCCOPY);
double angle = (m_angel/180.0)*3.14159;//右旋转45Degree
RotateAnyAngle(dcSrc,bm.bmWidth,bm.bmHeight,angle);//调用RotateAnyAngle函数

}
void MyPictureView::RotateAnyAngle(HDC dcSrc,int SrcWidth,int SrcHeight,double angle)
{
m_srcWidth=SrcWidth;
m_srcHeight=SrcHeight;
sinA = sin(angle);
cosA = cos(angle);
m_Flag=3;
this->Invalidate();//进行重画,自动调用OnDraw函数
}
void MyPictureView::OnDraw(CDC* pDC)
{
double x1,x2,x3;
double y1,y2,y3;
double srcX,srcY;
double DstWidth;
double DstHeight;
double minWidth,minHeight;
double maxWidth,maxHeight;
HBITMAP newBitmap;
HDC dcDst;
x1 = -m_srcHeight* sinA;
y1 = m_srcHeight * cosA;
x2 = m_srcWidth * cosA - m_srcHeight * sinA;
y2 = m_srcHeight * cosA + m_srcWidth * sinA;
x3 = m_srcWidth * cosA;
y3 = m_srcWidth * sinA;
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:minHeight;
maxWidth = x3>(x1>x2?x1:x2)?x3:(x1>x2?x1:x2);
maxWidth = maxWidth>0?maxWidth:0;
maxHeight = y3>(y1>y2?y1:y2)?y3:(y1>y2?y1:y2);
maxHeight = maxHeight>0?maxHeight:0;
DstWidth = maxWidth - minWidth;
DstHeight = maxHeight - minHeight;
dcDst = CreateCompatibleDC(dcSrc);
newBitmap = CreateCompatibleBitmap(dcSrc,(int)DstWidth,(int)DstHeight);
SelectObject(dcDst,newBitmap);
for( int I = 0 ;I<DstHeight;I++)
{
for(int J = 0 ;J< DstWidth;J++)
{
srcX = (J + minWidth) * cosA + (I + minHeight) * sinA;
srcY = (I + minHeight) * cosA - (J + minWidth) * sinA;
if( (srcX >= 0) && (srcX <= m_srcWidth) &&(srcY >= 0) && (srcY <= m_srcHeight))
{
BitBlt(dcDst, J, I, 1, 1, dcSrc,(int)srcX, (int)srcY, SRCCOPY);
}
}
}
::TransparentBlt(pDC>m_hDC,0,0,DstWidth*m_temp,DstHeight*m_temp,dcDst,0,0,DstWidth,DstHeight,RGB(0,0,0));//把黑色(0,0,0)过滤掉
hbmp= (HBITMAP)::LoadImage(AfxGetInstanceHandle(),m_picture, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION|LR_LOADFROMFILE);
::GetObject(hbmp,sizeof(BITMAP),(LPVOID)&bm);
m_angel+=45;//每次顺时针旋转45度
DeleteObject(m_hOldBmp);
DeleteObject(newBitmap);
DeleteDC(dcDst);
}
zhoujk 2011-07-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zhoujk 的回复:]
到我的资源去下载一个图像旋转的类,双精度插值的。不过是用C#写的,你要用的话,要自己改一下
[/Quote]
可以进行任意角度(双精度浮点值)的旋转
liuli7786 2011-07-18
  • 打赏
  • 举报
回复
[Quote=引用楼主 beprofessional 的回复:]
指针旋转时边缘会产生锯齿
[/Quote]
因为指针用的是图片,而图片中的每一个像素都是一个矩形,所以在移动的时候肯定会产生锯齿的。在指针90度、180度时锯齿就会不明显,这也印证了每一个像素是矩形。
liuli7786 2011-07-18
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 beprofessional 的回复:]
谢谢大家的帮忙!

请问1楼:

::TransparentBlt(pDC>m_hDC,0,0,DstWidth*m_temp,DstHeight*m_temp,dcDst,0,0,DstWidth,DstHeight,RGB(0,0,0));//把黑色(0,0,0)过滤掉

这个是为了去掉边缘的锯齿吗?谢谢!
[/Quote]
图片旋转后,在旋转后的位置进行了重画,但是图片原来的位置成了黑色,所以要把黑色给过滤掉。
BeProfessional 2011-07-18
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fengbingchun 的回复:]
opencv里有类似的图像旋转函数
[/Quote]

最开始就下载了OPENCV,准备用里面的旋转算法,按照网上别人的CODE写了个旋转DEMO,结果在cvCloneImage时老异常,就没继续下去了。请问具体的旋转函数在哪个源文件里面?谢谢!
BeProfessional 2011-07-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ywwj5858792qd 的回复:]
在GDI+中选择挺方便
[/Quote]

在WINCE中用,有些GDI+功能例如图像旋转不能用,谢谢。
BeProfessional 2011-07-18
  • 打赏
  • 举报
回复
谢谢大家的帮忙!

请问1楼:

::TransparentBlt(pDC>m_hDC,0,0,DstWidth*m_temp,DstHeight*m_temp,dcDst,0,0,DstWidth,DstHeight,RGB(0,0,0));//把黑色(0,0,0)过滤掉

这个是为了去掉边缘的锯齿吗?谢谢!

smwhotjay 2011-07-18
  • 打赏
  • 举报
回复
上下颠倒 是首行-尾行之间调换。。 左右交换 是每行rgb 的首尾调换。

旋转任意角度。 有点难度.我没想到好办法.
winning11xuhao 2011-07-18
  • 打赏
  • 举报
回复
OpenCV里面摄像机矫正部分由个函数,只要计算出四个顶点的位置变化就可以输入参数
fengbingchun 2011-07-18
  • 打赏
  • 举报
回复
opencv里有类似的图像旋转函数

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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