搜索
bottom↓
12
返回列表 发新帖
楼主: liuweiele

高效率 图像任意角度旋转算法(用整数运算实现)

[复制链接]

出0入0汤圆

发表于 2010-11-27 11:09:50 | 显示全部楼层
mark一下!牛人

出0入0汤圆

发表于 2010-11-27 11:26:59 | 显示全部楼层
GUI方面的专家...

出350入8汤圆

发表于 2010-11-27 11:32:03 | 显示全部楼层
mrak

出0入0汤圆

发表于 2010-11-30 17:22:05 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-30 18:56:22 | 显示全部楼层
楼主太帅;了

出0入0汤圆

发表于 2010-11-30 20:06:10 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-30 22:21:23 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-1 10:48:52 | 显示全部楼层
markii

出0入0汤圆

发表于 2010-12-14 23:13:30 | 显示全部楼层
Mark

出0入0汤圆

发表于 2011-1-12 11:50:08 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-1-12 12:24:23 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-1-12 12:32:36 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-1-27 16:10:34 | 显示全部楼层
记号一下

出0入0汤圆

发表于 2011-1-27 16:20:59 | 显示全部楼层
mark

出0入9汤圆

发表于 2011-1-27 16:33:49 | 显示全部楼层
好用

出0入0汤圆

发表于 2011-3-17 09:38:24 | 显示全部楼层
羡慕啊,顶

出0入0汤圆

发表于 2011-3-17 10:49:30 | 显示全部楼层
牛逼了  不得不顶 虽然不懂

出0入0汤圆

发表于 2011-3-17 10:54:40 | 显示全部楼层
既帅又帅啊!

出0入0汤圆

发表于 2011-3-17 11:36:01 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-6-4 11:10:55 | 显示全部楼层
仰视中

出50入10汤圆

发表于 2011-6-4 13:23:15 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-4 15:38:54 | 显示全部楼层
好东西,,收藏了以后用

出0入0汤圆

发表于 2011-6-8 09:54:05 | 显示全部楼层
楼主请教个问题,刚才拿了您的代码在STM32上试了下,发现图像右上角在转动时有时会没了一个角,是移植问题吗?

右上角没了 (原文件名:111.jpg)

右角没了 (原文件名:222.jpg)

出0入0汤圆

发表于 2011-6-8 09:57:20 | 显示全部楼层
还有。。透明是怎么跟背图运算的。。

出0入0汤圆

 楼主| 发表于 2011-6-8 10:12:07 | 显示全部楼层
回复【123楼】zhikai_wu
楼主请教个问题,刚才拿了您的代码在stm32上试了下,发现图像右上角在转动时有时会没了一个角,是移植问题吗?


右上角没了 (原文件名:111.jpg)

<center>
右角没了
-----------------------------------------------------------------------

你是用哪个 OS 和 GUI ?

出0入0汤圆

发表于 2011-6-8 10:56:19 | 显示全部楼层
回复【125楼】liuweiele Liuwei
回复【123楼】zhikai_wu  
楼主请教个问题,刚才拿了您的代码在stm32上试了下,发现图像右上角在转动时有时会没了一个角,是移植问题吗?  

  
右上角没了 (原文件名:111.jpg)

<center>  
右角没了  
-----------------------------------------------------------------------
你是用哪个 os 和 gui ?
-----------------------------------------------------------------------

没用OS和GUI呢

出0入0汤圆

 楼主| 发表于 2011-6-8 11:55:13 | 显示全部楼层
回复【126楼】zhikai_wu
-----------------------------------------------------------------------

检查你的 math 库函数是否正常,还有数据类型是否匹配.

出0入0汤圆

发表于 2011-6-8 12:34:49 | 显示全部楼层
这是改后的程序,如是float radians; 定义成s32图就不会转动。


#define MAX(a,b) ((a) > (b) ? (a) : (b))
#define MIN(a,b) ((a) > (b) ? (b) : (a))
       
       
typedef struct
{
        u16 Width;
        u16 Height;
        u16 Data[];
}IMAGE;

/*******************************************************************************
函数:
功能: 图片旋转
参数: u16 x, u16 y,
返回: x,y: ,hImg : 图片,angle:角度
********************************************************************************/
void RotateImage(int x,int y,IMAGE *hImg,int angle)
{
   float radians;
   s32 cos_a,sin_a,cos_ay,sin_ay;
   s32 point1x,point1y,point2x,point2y,point3x,point3y;
   s32 minx,miny,maxx,maxy;
   s32 xx,yy,xx0,yy0,xx1,yy1,cx,cy,src_dx,src_dy,dst_dx,dst_dy;
   u16 color;
   IMAGE *img;

   ///////////
   //算法优化思路:小数除法->整数除法->乘法->加法
       
   img=hImg;

   src_dx  = img->Width;
   src_dy  = img->Height;
   angle  %= 360;
       
        //计算外接矩形坐标
   radians = (2*(float)3.1415*angle)/(float)360.0;
   cos_a   = (s32)(cos(radians)*(float)65536.0);
   sin_a   = (s32)(sin(radians)*(float)65536.0);
   point1x = (-src_dy*sin_a)>>16;
   point1y = (src_dy*cos_a)>>16;
   point2x = (src_dx*cos_a-src_dy*sin_a)>>16;
   point2y = (src_dy*cos_a+src_dx*sin_a)>>16;
   point3x = (src_dx*cos_a)>>16;
   point3y = (src_dx*sin_a)>>16;
       
       
   minx = MIN(0,MIN(point1x,MIN(point2x,point3x)));
   miny = MIN(0,MIN(point1y,MIN(point2y,point3y)));
       
   maxx = MAX(point1x,MAX(point2x,point3x));
   maxy = MAX(point1y,MAX(point2y,point3y));


   // 取得最小整数
   if(angle>90&&angle<180)
   {
      dst_dx=(int)ceil(-minx);
   }
   else
   {
      dst_dx=(int)ceil(maxx-minx);
   }

   if(angle>180&&angle<270)
   {
      dst_dy=(int)ceil(-miny);
   }
   else
   {
      dst_dy=(int)ceil(maxy-miny);
   }

   cx        =(dst_dx>>1);        //目标位置中心点的x偏移
   cy        =(dst_dy>>1);        //目标位置中心点的y偏移
       
       
   cos_ay        =(miny*cos_a)>>16;       
   sin_ay        =(miny*sin_a)>>16;
   ////////////
//-------------------------------------------------------------
/*        if(((IMAGE*)hImg)->Bpp==32)
   {
   
      //ARGB 8888格式(带Alpha通道)
      for(yy=0;yy<dst_dy;yy++)
      {
         cos_ay        =((yy+miny)*cos_a)>>16;       
         sin_ay        =((yy+miny)*sin_a)>>16;
      ////
         yy0        =y+yy-cy;
                       
         if(yy0<0)                        continue;
         if(yy0>pdc->ymax)        return;
                       
         for(xx=0;xx<dst_dx;xx++)
         {
         ////
            xx1        =((((xx+minx)*cos_a)>>16)+sin_ay); //计算坐标
            yy1        =(cos_ay-(((xx+minx)*sin_a)>>16));
            ////
                               
            xx0        =x+xx-cx;
                               
            if(xx1>=0&&xx1<src_dx&&yy1>=0&&yy1<src_dy&&xx0>0&&xx0<pdc->xmax)  
            {
               color        =img->Data[yy1*img->Width+xx1];
                                               
               pdc->PutPixel(pdc,xx0,yy0,AlphaBlendColor(color,GetPixel(hdc,xx0,yy0),img->AlphaData[yy1*img->Width+xx1]));
            }
         }
      }
   }
        else
        {
*/
   //其它格式(不带Alpha通道)
      for(yy=0;yy<dst_dy;yy++)
      {
         cos_ay        =((yy+miny)*cos_a)>>16;
         sin_ay        =((yy+miny)*sin_a)>>16;
         ////
         yy0        =y+yy-cy;
         if(yy0<0)        continue;
         if(yy0>LCD_Ymax)        return;
                       
         for(xx=0;xx<dst_dx;xx++)
         {
            xx1        =((((xx+minx)*cos_a)>>16)+sin_ay);        //计算坐标
            yy1        =(cos_ay-(((xx+minx)*sin_a)>>16));
                                ////
            xx0        =x+xx-cx;
                                       
            if(xx1>=0&&xx1<src_dx&&yy1>=0&&yy1<src_dy&&xx0>0&&xx0<LCD_Xmax)
            {
               color = img->Data[yy1*img->Width+xx1];

               LCD_SetCursor(xx0,yy0);   
               TFT_DRAW_Point(color);  // 1
            }
         }
      }
//        }
}

出0入0汤圆

发表于 2011-6-8 12:39:13 | 显示全部楼层
用的是IAR编译

出0入0汤圆

发表于 2011-6-9 10:29:52 | 显示全部楼层
我做虚拟仪表也是用的旋转图像的办法
就是简单的坐标变换

出0入0汤圆

发表于 2011-6-9 22:48:13 | 显示全部楼层
过来膜拜 下

出0入0汤圆

发表于 2011-6-10 09:06:48 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-11 19:01:52 | 显示全部楼层
wo ca

出0入0汤圆

发表于 2011-6-11 19:11:06 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-11 22:21:10 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-12 20:23:15 | 显示全部楼层
太牛逼了

出0入0汤圆

发表于 2011-6-16 23:16:35 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-6-24 12:45:49 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-26 10:30:24 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-8-16 00:46:47 | 显示全部楼层
楼主威武!记号备用!

出0入0汤圆

发表于 2011-12-6 18:34:17 | 显示全部楼层
好东西 图像旋转

出0入0汤圆

发表于 2011-12-6 19:24:37 | 显示全部楼层

出0入0汤圆

发表于 2011-12-7 11:52:46 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-7 15:28:53 | 显示全部楼层
膜拜中

出0入0汤圆

发表于 2011-12-13 14:17:11 | 显示全部楼层
厉害

出0入0汤圆

发表于 2012-3-1 14:38:46 | 显示全部楼层
太牛了,以后也得研究一下这个

出0入0汤圆

发表于 2012-3-2 21:03:14 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-3-4 17:03:28 | 显示全部楼层
不错的旋转gui

出0入0汤圆

发表于 2012-3-4 20:04:04 | 显示全部楼层
马克

出0入0汤圆

发表于 2012-3-4 20:15:43 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-3-4 22:12:26 | 显示全部楼层
mark 图像旋转

出0入0汤圆

发表于 2012-3-8 08:19:52 | 显示全部楼层
好东西又翻出来了

出0入0汤圆

发表于 2012-3-8 09:09:02 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-3-8 09:27:39 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-3-8 13:56:29 | 显示全部楼层
再做一把MARK党

出0入0汤圆

发表于 2012-3-8 14:28:11 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-4-6 10:19:24 | 显示全部楼层
强烈要求楼主写一篇自传,让我们分享一下学习经验

出0入0汤圆

发表于 2012-4-15 11:54:19 | 显示全部楼层

出0入0汤圆

发表于 2013-1-18 23:52:22 | 显示全部楼层
mark 有空再仔细看看。。。

出0入0汤圆

发表于 2013-1-19 08:29:51 | 显示全部楼层
mark 收了慢慢看

出0入0汤圆

发表于 2013-1-19 11:31:07 | 显示全部楼层
学习下
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-3 06:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表