我需要一个基本的想法,如何在特定区域的触摸下扭曲图像。图像滤镜在整个图像上应用扭曲,但我想扭曲单点,就像我想扭曲一个人的眼睛然后我将触及那一点。所以我需要一个关于这项工作的基本想法。
我尝试了这个,但它也在整个图像上应用滤镜。 https://github.com/Jtfinlay/PhotoWarp
应用: https://play.google.com/store/apps/details?id=hu.tonuzaba.android&hl=en
答案 0 :(得分:5)
经线不只是在“单点”,而是在某些区域,您可以顺利地变形。
要实现此目的,您需要在触摸点的某个邻域中起作用的坐标的几何变换。实现此目的的一种方法是在图像上应用方形网格,并使用您的一些定律在触摸点周围移动网格节点(例如,将位移矢量应用于所有节点,具有衰减因子,使得远处节点不会不动了。
然后你需要一个重采样函数来计算每个像素的新坐标并复制源像素的颜色。
为了获得良好的效果,您必须实际反向工作:扫描目标图像,并为每个像素检索源坐标和源像素。应用双线性或双三次重采样以避免混叠。
为了便于实现,还应该调整网格化思路:而不是使目标网格变形,保持不变并将逆变形应用于源网格。
最后一件事:在网格方法中,将网格节点的位移视为可以单独处理的两个标量函数DX(i,j)和DY(i,j)。根据节点位移的知识,您可以通过插值估计任何像素的位移(这里适用双三次)。
答案 1 :(得分:4)
您可以使用画布来检测该部分,并在ontouchlistener
上停止对该部分的操作代码示例
Bitmap pricetagBmp = BitmapFactory.decodeResource(getActivity().getResources(), R.drawable.ic_tag_circle_24dp);
// canvas.drawBitmap(pricetagBmp,left + (right - left) / 2, top + (bottom - top) / 2 - (bounds.height() / 2),circlePaint);
float imageStartX = (left + ((right-left)/2)) - (pricetagBmp.getWidth()/2);
float imageStartY = (top + ((bottom - top) / 2)) - (pricetagBmp.getHeight()/2);
canvas.drawBitmap(pricetagBmp, imageStartX, imageStartY,circlePaint);
并且在ontouchlistener中,如果检测到这些点,则无法执行任何操作
注意:您可以使用drawRect或其他具有不可见颜色的
替换drawBitmap