社区
图形处理/算法
帖子详情
图像旋转算法!
BeProfessional
2011-07-18 10:38:32
想做个类似时钟的画面,指针旋转时边缘会产生锯齿,指针用的png图片,请问有没有好的旋转算法?谢谢!
...全文
556
17
打赏
收藏
图像旋转算法!
想做个类似时钟的画面,指针旋转时边缘会产生锯齿,指针用的png图片,请问有没有好的旋转算法?谢谢!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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里有类似的图像旋转函数
图片旋转 任意角度 图象
算法
相信很多人都为怎么去写一个图片旋转
算法
而苦恼不以.现在上传一个动态连接库和相应的源代码,方法大家直接使用.测试后效率非常好.是个非常不错的
算法
. 支持C C++ VC VB C# 等等N多编程语言.
基于Bresenham画线
算法
的图像快速、高精度旋转
算法
基于Bresenham画线
算法
的图像快速、高精度旋转
算法
一种改进的
图像旋转
算法
.caj
针对一般方法对图像进行多次旋转会丢失图像信息的现象,提出了一种以步进方式进行
图像旋转
的
算法
,实验证明该方法效果良好
基于FPGA的
图像旋转
算法
基于FPGA的
图像旋转
算法
多幅
图像旋转
拼接
算法
旋转拼接
算法
,该
算法
在常规几何旋转
算法
的基础之上,将多幅图像的旋转拼接分成了两 个部分:先进行子图像的旋转,然后确定子
图像旋转
后所得到的新图像在屏幕坐标系中的 位置并显示。给出了详细的推导过程,并在...
图形处理/算法
19,468
社区成员
50,698
社区内容
发帖
与我相关
我的任务
图形处理/算法
VC/MFC 图形处理/算法
复制链接
扫一扫
分享
社区描述
VC/MFC 图形处理/算法
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章