触摸点区域时扭曲图像区域?
Warp Image area on touch of a point area?
我需要一个关于如何在触摸特定区域时扭曲图像的基本概念。图像滤镜对整个图像应用扭曲,但我想扭曲单个点,就像如果我想扭曲一个人的眼睛,那么我会触及那个点。所以我需要对这项工作有一个基本的了解。
我试过这个,但它也会对整个图像应用滤镜。
https://github.com/Jtfinlay/PhotoWarp
应用:
https://play.google.com/store/apps/details?id=hu.tonuzaba.android&hl=en
扭曲不仅在 "single point" 处,而且在您以平滑方式变形的某些区域上。
为此,您需要对触摸点附近的坐标进行几何变换。一种方法是在图像上应用正方形网格,并根据您的一些法则在触摸点周围移动网格节点(例如,将位移矢量应用于所有节点,并使用衰减因子使得远处的节点不会'移动)。
然后您需要一个重采样函数来计算每个像素的新坐标并复制源像素的颜色。
为了获得好的结果,您实际上必须反向工作:扫描目标图像并为每个像素检索源坐标和源像素。应用双线性或双三次重采样以避免混叠。
为了便于实施,还应调整网格化思想:不要对目标网格进行变形,而是保持其不变并将反向变形应用于源网格。
最后一件事:在网格方法中,将网格节点的位移视为您可以单独处理的两个标量函数 DX(i, j) 和 DY(i, j)。根据节点位移的知识,您可以通过插值估计任何像素的位移(这里双三次是合适的)。
您可以使用 canvas 检测该部分并在 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 中,如果检测到该点,您可以不执行任何操作
注意:您可以将 drawBitmap 替换为 drawRect 或其他具有不可见颜色的东西
我需要一个关于如何在触摸特定区域时扭曲图像的基本概念。图像滤镜对整个图像应用扭曲,但我想扭曲单个点,就像如果我想扭曲一个人的眼睛,那么我会触及那个点。所以我需要对这项工作有一个基本的了解。
我试过这个,但它也会对整个图像应用滤镜。 https://github.com/Jtfinlay/PhotoWarp
应用: https://play.google.com/store/apps/details?id=hu.tonuzaba.android&hl=en
扭曲不仅在 "single point" 处,而且在您以平滑方式变形的某些区域上。
为此,您需要对触摸点附近的坐标进行几何变换。一种方法是在图像上应用正方形网格,并根据您的一些法则在触摸点周围移动网格节点(例如,将位移矢量应用于所有节点,并使用衰减因子使得远处的节点不会'移动)。
然后您需要一个重采样函数来计算每个像素的新坐标并复制源像素的颜色。
为了获得好的结果,您实际上必须反向工作:扫描目标图像并为每个像素检索源坐标和源像素。应用双线性或双三次重采样以避免混叠。
为了便于实施,还应调整网格化思想:不要对目标网格进行变形,而是保持其不变并将反向变形应用于源网格。
最后一件事:在网格方法中,将网格节点的位移视为您可以单独处理的两个标量函数 DX(i, j) 和 DY(i, j)。根据节点位移的知识,您可以通过插值估计任何像素的位移(这里双三次是合适的)。
您可以使用 canvas 检测该部分并在 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 中,如果检测到该点,您可以不执行任何操作
注意:您可以将 drawBitmap 替换为 drawRect 或其他具有不可见颜色的东西