2017-07-19 159 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硬 - 我已經添加了筆記。您可以根據您的要求進行更改 –