EVE-17 图片的缩放和旋转

22 篇文章 0 订阅

1.      缩放

CMD_SCALE –对目前的矩阵做一个缩放

#define ftCoCmdScale(sx, sy)\

{\

      ftWrDispCmd(CMD_SCALE);\

      ftWrDispCmd(sx);\

      ftWrDispCmd(sy);\

}

参数sx、sy分别表示x轴、y轴方向上的缩放,等于缩放倍数乘以65536,例如X轴上放大为2倍,sx = 65536 * 2,Y轴上缩小到0.5倍,sy = 65536 * 0.5。

注意如果图片是要放大,定义handle时的BITMAP_SIZE和BITMAP_SIZE_H需要设置为放大后的大小,例如10x20的L 8格式图片,放大2倍,BITMAP_SIZE的值为10*2, 20*2。

在调用ftCoCmdScale前还需要写入命令CMD_LOADIDENTITY,后面还需要写入命令CMD_SETMATRIX。例程如下:

      ftWrDispCmd(CMD_LOADIDENTITY);

      ftCoCmdScale(0x10000 * 2, 0x10000);

      ftWrDispCmd(CMD_SETMATRIX);

      ftWrDispCmd(VERTEX2F(0 * 16 , 0 * 16));

下图中第一个对应上面代码的显示效果

第二张是Y轴放大2倍,这2张图片的handle定义时BITMAP_SIZE和BITMAP_SIZE_H是实际图片的大小,所以显示时有部分没有显示出来,第三张是X,Y轴都缩小为0.5,第四张是X,Y轴放大2倍。

如果显示完缩放图片后需要恢复原来的SCALE设定,可以增加命令SAVE_CONTEXT()和RESTORE_CONTEXT()实现,这样不会影响接下来的图片显示。

      ftWrDispCmd(SAVE_CONTEXT());

      ftWrDispCmd(CMD_LOADIDENTITY);

      ftCoCmdScale(0x10000 * 2, 0x10000 * 2);

      ftWrDispCmd(CMD_SETMATRIX);

      ftWrDispCmd(VERTEX2F((LCD_WIDTH / 2 + 80) * 16, (LCD_HEIGHT / 2 - 30) * 16));

      ftWrDispCmd(RESTORE_CONTEXT());

2.      旋转

CMD_ROTATE -将目前矩阵做旋转

#define ftCoCmdRotate(a)\

{\

      ftWrDispCmd(CMD_ROTATE);\

      ftWrDispCmd((int32_t)a * 65536 / 360)\

}

参数a是顺时针旋转的度数,旋转的原点是左顶点。其他使用方法和缩放类似。

      ftWrDispCmd(SAVE_CONTEXT());

      ftWrDispCmd(CMD_LOADIDENTITY);

      ftCoCmdRotate(30);

      ftWrDispCmd(CMD_SETMATRIX);

      ftWrDispCmd(VERTEX2F((LCD_WIDTH / 2 - 150) * 16, (LCD_HEIGHT / 2 - 30) * 16));

      ftWrDispCmd(RESTORE_CONTEXT());

如上图,图片旋转了30°,因为定义handle时是使用60x60的大小,所以部分显示丢失了。一般情况旋转并不是以左顶点旋转,应该是选择中心位置旋转,可以使用命令CMD_TRANSLATE重新设定旋转中心。

#define ftCoCmdTranslate(tx, ty)\

{\

      ftWrDispCmd(CMD_TRANSLATE);\

      ftWrDispCmd((int32_t)tx * 65536);\

      ftWrDispCmd((int32_t)ty * 65536);\

}

上面的例子设定偏移后旋转,旋转完需要偏移回去,代码如下。

      ftWrDispCmd(SAVE_CONTEXT());

      ftWrDispCmd(CMD_LOADIDENTITY);

      ftCoCmdTranslate(60 / 2, 60 / 2);

      ftCoCmdRotate(30);

      ftCoCmdTranslate(-60 / 2, -60 / 2);

      ftWrDispCmd(CMD_SETMATRIX);

      ftWrDispCmd(VERTEX2F((LCD_WIDTH / 2 + 80) * 16, (LCD_HEIGHT / 2 - 30) * 16));

      ftWrDispCmd(RESTORE_CONTEXT());

这种方式适合本身图片是圆的情况,如果图片不是圆的还是会被切掉4个角,如下图

要解决这个问题,需要调整BITMAP_SIZE和BITMAP_SIZE_H的大小,并且要改变图片的坐标

    ftWrDispCmd(BITMAP_HANDLE(HANDLE_HOME));
    ftWrDispCmd(BITMAP_SOURCE(0));
    ftWrDispCmd(BITMAP_LAYOUT(L4, 30, 60));
    ftWrDispCmd(BITMAP_LAYOUT_H(30, 60));
    ftWrDispCmd(BITMAP_SIZE(NEAREST, BORDER, BORDER, 60 * 2, 60 * 2));
    ftWrDispCmd(BITMAP_SIZE_H(60 * 2, 60 * 2));

    ftWrDispCmd(SAVE_CONTEXT());
    ftWrDispCmd(CMD_LOADIDENTITY);
    ftCoCmdTranslate(60, 60);
    ftCoCmdRotate(45);
    ftCoCmdTranslate(-30, -30);
    ftWrDispCmd(CMD_SETMATRIX);
    ftWrDispCmd(VERTEX2F((LCD_WIDTH / 2 + LCD_WIDTH / 8 - 20 - 30) * 16, (LCD_HEIGHT / 2 - 30 - 30) * 16));
    ftWrDispCmd(RESTORE_CONTEXT());

还有一种方式是改变原图大小,让图片变为正方形,且宽度变为外切圆的直径,这样算法最简单,只是占用的存储空间变大。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值