【问题标题】:Warp Image area on touch of a point area?触摸点区域时扭曲图像区域?
【发布时间】:2024-05-17 01:15:01
【问题描述】:

我需要一个基本的想法来了解如何在触摸特定区域时扭曲图像。图像过滤器在整个图像上应用扭曲,但我想扭曲单个点,就像如果我想扭曲一个人的眼睛,那么我会触及那个点。所以我需要对这项工作有一个基本的了解。

我已经尝试过这个,但它也对整个图像应用了过滤器。 https://github.com/Jtfinlay/PhotoWarp

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

【问题讨论】:

标签: android image-processing image-editing


【解决方案1】:

翘曲不仅仅是在“单个点”,而是在您以平滑方式变形的某个区域。

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

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

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

为了便于实现,网格化的思想也应该进行调整:不要对目标网格进行变形,而是保持其不变并将反向变形应用于源网格。

最后一件事:在网格方法中,将网格节点的位移视为可以分别处理的两个标量函数 DX(i, j) 和 DY(i, j)。根据节点位移的知识,您可以通过插值估计任何像素的位移(此处适合使用双三次)。

【讨论】:

    【解决方案2】:

    您可以使用画布检测该部分并在 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

    【讨论】:

    • 将drawable放在画布上,但我想对触摸区域执行一些扭曲效果,这将修改基本图像而不是放置drawable,但感谢您的回答
    • @joy Hard - 我已经添加了注释。您可以根据需要更改它