http://cache.amobbs.com/bbs_upload782111/files_40/ourdev_646714XWOZ8A.jpg
右上角没了 (原文件名:111.jpg)
http://cache.amobbs.com/bbs_upload782111/files_40/ourdev_646717ZKX23L.jpg
右角没了 (原文件名:222.jpg) 还有。。透明是怎么跟背图运算的。。 回复【123楼】zhikai_wu
楼主请教个问题,刚才拿了您的代码在stm32上试了下,发现图像右上角在转动时有时会没了一个角,是移植问题吗?
右上角没了 (原文件名:111.jpg)
<center>
右角没了
-----------------------------------------------------------------------
你是用哪个 OS 和 GUI ? 回复【125楼】liuweiele Liuwei
回复【123楼】zhikai_wu
楼主请教个问题,刚才拿了您的代码在stm32上试了下,发现图像右上角在转动时有时会没了一个角,是移植问题吗?
右上角没了 (原文件名:111.jpg)
<center>
右角没了
-----------------------------------------------------------------------
你是用哪个 os 和 gui ?
-----------------------------------------------------------------------
没用OS和GUI呢 回复【126楼】zhikai_wu
-----------------------------------------------------------------------
检查你的 math 库函数是否正常,还有数据类型是否匹配. 这是改后的程序,如是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;
pdc->PutPixel(pdc,xx0,yy0,AlphaBlendColor(color,GetPixel(hdc,xx0,yy0),img->AlphaData));
}
}
}
}
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;
LCD_SetCursor(xx0,yy0);
TFT_DRAW_Point(color);// 1
}
}
}
// }
} 用的是IAR编译 我做虚拟仪表也是用的旋转图像的办法
就是简单的坐标变换 过来膜拜 下 mark wo ca mark mark 太牛逼了 MARK mark mark 楼主威武!记号备用! 好东西 图像旋转 强 mark 膜拜中 厉害 太牛了,以后也得研究一下这个 mark 不错的旋转gui 马克 mark mark 图像旋转 好东西又翻出来了 mark mark 再做一把MARK党 mark 强烈要求楼主写一篇自传,让我们分享一下学习经验{:victory:} {:time:}{:call:} mark 有空再仔细看看。。。 mark 收了慢慢看 {:3_48:}学习下
页:
1
[2]