android 图片编辑之拉直功能实现原理

需求

最近有个图片编辑中拉直图片的一个需求要实现,实际上就是把图片等比放大之后旋转一定的角度显示出来,当然限制条件是变换后的图片的要将取景框完全包含进来。作为一个伸手党当然第一反应是四处搜寻一番,同事直接把5.0系统相机Gallery部分发了过来。代码抠出来之后的demo效果正与期望效果相反——原生代码实现的是图片中心旋转、取景框实时缩放的效果,而我们需要取景框不动,图片自行旋转缩放。不过有了葫芦、瓢就不难画了,好歹咱也是初中毕过业的姿势分子,这题目不难做。

原理

输入是旋转的角度,我们所未知的是图片该放多大才能保证与原图等大的取景框画出合适的效果,图片的角度与放大比例算对了,效果也就出来了,至于其他的如角度如何生成、图片截取如何保存之类的事参考源码就好。于是抽象出几何题一道:

图一

(抱歉,几何图软件不是很会用,将就着看吧)如图所示已知矩形ABCD的宽、高为w、h,将该矩形中心旋转α度之后并放大x倍之后得到矩形A’B’C’D’,且B、D两点分别在线B’C、’A’D’上,求x。

解:取ABCD横向两边的中点F、G,A’B’C’D’横向两边的中点H、I,如图所示得到辅助线HI、FG、EB,E是两个矩形的共同中心点;

∵ABCD是矩形

∴△EGB是RT△

∴∠GEB = arctan(GB/EG) = arctan(BC/AD) = arctan(w/h)

∴∠IEB = ∠GEB - ∠α

并且EB = √(EG^2+GB^2) = √(w^2+h^2)/2

∵A’B’C’D’是矩形

∴△FIB是RT△

∴EI = EB*cos∠IEB

∵h’ = HI = 2EI

∴h’ = 2 (√(w^2+h^2)/2) cos(arctan(w/h) - ∠α)

∵是等比放大

∴x = h’/h = √(w^2+h^2)* cos(arctan(w/h) - ∠α)/ h

是不是清晰的代码随着最后的等式也同步敲出了呢~不过不要急,实际检测发现这不是所有状况,w>h的情况如此解是无问题的,相反的情况就不行了,道理相似如下图:

图二

唔,作为一个懒人不想再敲解题过程了。提示一下两部分代码是可以合成一个函数的,需要一些简单的三角函数变换。知识就是力量,谁说学习没有卵用的?

参考与工具

  1. android5.0 Gallery部分源码;
  2. 几何绘图软件math3d
感谢您赏个荷包蛋~