2017-07-19 46 views
10

我需要一个基本的想法,我怎样才能扭曲特定区域的触摸图像。图像过滤器在整个图像上应用扭曲,但我想扭曲单点,就像如果我想扭曲人的眼睛那么我会触及那一点。所以我需要一个关于这项工作的基本想法。扭曲点区域上的图像区域?

我试过这个,但它也适用于整个图像的过滤器。 https://github.com/Jtfinlay/PhotoWarp

应用: https://play.google.com/store/apps/details?id=hu.tonuzaba.android&hl=en

+0

参考t他:https://stackoverflow.com/questions/9237924/how-to-warp-images-in-android –

+0

提到这个: [如何扭曲图像](https://stackoverflow.com/questions/9237924/how -with-warp-images-in-android) –

+0

这样做并不适用于我的例外情况,保存warp状态很方便。 –

回答

6

一经不只是在“单点”,但在你的一路畅通变形部分地区。

为了实现这一点,您需要对触摸点的某个邻域内的坐标进行几何变换。一种方法是在图像上应用一个正方形网格,并按照您的某些定律在接触点周围移动网格节点(例如,将位移矢量应用于所有节点,其衰减因子使得远处的节点不会不动)。

然后,您需要重新采样函数来计算每个像素的新坐标并复制源像素的颜色。

为了获得好的结果,您必须反向工作:扫描目标图像并为每个像素检索源坐标和源像素。应用双线性或双三次重采样以避免混叠。

为了便于实施,网格化思想也应该进行调整:而不是变形目标网格,保持其不变并将反向变形应用到源网格。最后一件事:在网格方法中,将网格节点的位移看作两个标量函数DX(i,j)和DY(i,j),您可以分别处理它们。根据节点位移的知识,可以通过插值来估计任何像素的位移(双三次在这里是合适的)。

5

可以使用帆布,以检测部和在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

+1

这是可以绘制在画布上,但我想对触摸区域执行一些扭曲效果,将修改基本图像,而不是绘制,但感谢您的回答 –

+1

@joy硬 - 我已经添加了笔记。您可以根据您的要求进行更改 –