2017-07-19 9 views
10

मुझे एक बुनियादी विचार की आवश्यकता है कि मैं किसी विशेष क्षेत्र के स्पर्श पर छवि कैसे बना सकता हूं। छवि फ़िल्टर पूरी छवि पर वार लागू करते हैं लेकिन मैं एकल बिंदु को लाना चाहता हूं, जैसे कि अगर मैं किसी व्यक्ति की आंखों को झुकाव करना चाहता हूं तो मैं उस बिंदु पर छूंगा। तो मुझे इस काम के बारे में एक बुनियादी विचार की जरूरत है।एक बिंदु क्षेत्र के स्पर्श पर वार छवि क्षेत्र?

मैंने इसे आजमाया है लेकिन यह पूरी छवि पर फ़िल्टर भी लागू करता है। https://github.com/Jtfinlay/PhotoWarp

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

+0

के साथ कुछ और उसका: https://stackoverflow.com/questions/9237924/how-to-warp-images-in-android –

+0

इसे देखें: [छवि को कैसे वार करें] (https://stackoverflow.com/questions/9237924/how -to-warp-images-in-android) –

+0

इसके साथ किया गया है जो मेरे अपवादों तक काम नहीं करता है, युद्ध के राज्यों को बचाने में यह आसान है। –

उत्तर

6

एक ताना सिर्फ एक "एकल बिंदु" पर लेकिन कुछ क्षेत्र है कि आप एक चिकनी रास्ते में ख़राब खत्म नहीं हुआ है।

इसे प्राप्त करने के लिए, आपको समन्वय के ज्यामितीय परिवर्तन की आवश्यकता है जो स्पर्श बिंदु के कुछ पड़ोस में काम करता है। ऐसा करने का एक तरीका छवि पर एक स्क्वायर ग्रिड लगाने और अपने कुछ कानूनों के साथ छूने वाले बिंदुओं के चारों ओर ग्रिड नोड्स को स्थानांतरित करना है (उदाहरण के लिए, सभी नोड्स में एक विस्थापन वेक्टर लागू करें, एक क्षय कारक के साथ, जैसे दूर नोड्स डॉन हिलना नहीं है)।

फिर आपको एक पुनरावृत्ति समारोह की आवश्यकता है जो प्रत्येक पिक्सेल के नए निर्देशांक की गणना करता है और स्रोत पिक्सेल के रंग की प्रतिलिपि बनाता है।

अच्छे परिणामों के लिए, आपको वास्तव में रिवर्स में काम करना होगा: गंतव्य छवि को स्कैन करें और प्रत्येक पिक्सेल के लिए स्रोत निर्देशांक और स्रोत पिक्सल पुनर्प्राप्त करें। एलियासिंग से बचने के लिए बिलीनेर या बाइबिक रीसाम्पलिंग लागू करें।

कार्यान्वयन की आसानी के लिए, ग्राउंडिंग विचार को भी अनुकूलित किया जाना चाहिए: गंतव्य ग्रिड को विकृत करने के बजाय, इसे अपरिवर्तित रखें और स्रोत ग्रिड में व्यस्त विकृति लागू करें।

अंतिम बात: ग्रिड दृष्टिकोण में, ग्रिड नोड्स के विस्थापन को दो स्केलर फ़ंक्शन डीएक्स (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 में है कि अगर पता लगाया अंक आप कोई कार्यवाही नहीं कर सकता

नोट: आप drawRitmap को drawRect के साथ प्रतिस्थापित कर सकते हैं या अदृश्य रंग

+1

जो कैनवास पर खींचने योग्य है लेकिन मैं स्पर्श के क्षेत्र पर कुछ विकृत प्रभाव करना चाहता हूं जो ड्रॉइंग डालने की बजाए बेस छवि को संशोधित करेगा लेकिन आपके उत्तर के लिए धन्यवाद –

+1

@joy Hard - मैंने नोट जोड़ा है। आप इसे अपनी आवश्यकता के अनुसार बदल सकते हैं –

संबंधित मुद्दे