2017-07-19 40 views
10

Belirli bir alana dokunarak görüntüyü nasıl çözebilirim diye temel bir fikre ihtiyacım var. Görüntü filtreleri tüm görüntü üzerine çözgü uygular ama ben tek bir noktayı çözerim, sanki bir insanın gözünü eğmek istiyorsam, o noktaya değineceğim. Bu yüzden bu çalışma hakkında temel bir fikre ihtiyacım var.Çözgü Görüntü alanı bir nokta alanına dokunuyor mu?

Bunu denedim ancak tüm görüntülerde filtreler de var. https://github.com/Jtfinlay/PhotoWarp

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

+0

Onun: https://stackoverflow.com/questions/9237924/how-to-warp-images-in-android –

+0

buna bakın: [nasıl çözgü görüntü] (https://stackoverflow.com/questions/9237924/how -to-warp-görüntüleri-in-android) –

+0

ile yapılan istisnalar kadar çalışır, warp durumlarını kaydetme yararlıdır. –

cevap

6

Bir çözgü sadece bir "tek noktada" ama çok yumuşak bir şekilde deforme bazı alana değildir.

Bunu başarmak için, temas noktasının bazı mahallelerinde çalışan koordinatların geometrik bir dönüşümü gerekir. Bunu yapmanın bir yolu, resmin üzerine bir kare ızgara uygulamak ve bazı düğümleri ile birlikte dokunmuş noktaların etrafındaki ızgara düğümlerini hareket ettirmek (örneğin, tüm düğümlere bir yer değiştirme vektörü uygulamak, böylece çok uzak düğümler gibi bir bozucu etken) Hareket et.

Ardından, her pikselin yeni koordinatlarını hesaplayan ve kaynak pikselinin rengini kopyalayan bir yeniden örnekleme işlevine ihtiyacınız vardır.

İyi sonuçlar elde etmek için aslında tersine işlem yapmalısınız: hedef resmi tara ve her piksel için kaynak koordinatlarını ve kaynak piksellerini al. Takma adlarından kaçınmak için bilineik veya bicubic yeniden örnekleme uygulayın.

Uygulama kolaylığı için, kılavuzlama fikri de uyarlanmalıdır: hedef ızgarayı deforme etmekten ziyade, değiştirilmemeli ve tersine deformasyonu kaynak ızgaraya uygulamalısınız.

Son şey: ızgara yaklaşımında, ayrı ayrı ele alabileceğiniz iki skaler fonksiyon DX (i, j) ve DY (i, j) olarak ızgara düğümlerinin yer değiştirmelerine bakın. Düğümlerdeki deplasmanların bilgisinden, herhangi bir pikselin enterpolasyonla yer değiştirmesini tahmin edebilirsiniz (burada bicubic uygun olacaktır).

5

o kısmını algılar ve ontouchlistener bu bölümünde eylemi durdurmak için tuval kullanabilirsiniz

kod örneği

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); 

ve ontouchlistener içinde o hiçbir eylemi gerçekleştirebilir tespit noktalar halinde

Not: drawBitmap öğesini drawRect veya başka bir şeyle görünmez bir renkle değiştirebilirsiniz

+1

tuval üzerine çizilebilir ama ben çekmece koymak yerine temel görüntü değiştirecek dokunma alanı üzerinde bazı bozulma etkisi gerçekleştirmek istiyorum ama cevabınız için teşekkürler –

+1

@joy Zor - notu ekledim. ihtiyacınıza göre değiştirebilirsiniz –