5

मैं एक अनुप्रयोग को लागू करने की कोशिश कर रहा हूं जो शिप्पर विकृति फ़िल्टर का उपयोग करता है। मैं here से एल्गोरिदम का उपयोग कर रहा हूं जो getixix() और setpixel() विधियों द्वारा पिक्सल स्थान बदलता है। मेरी समस्या यह है कि यह एंड्रॉइड डिवाइसों के लिए बहुत धीमी है और ऐसे अनुप्रयोग हैं जो मेरे दृष्टिकोण की तुलना में समान क्षेत्र (और अन्य) फ़िल्टर तरीके को लागू करते हैं। (उदाहरण के लिए Picsay Pro ऐप) क्या कोई भी तेजी से विरूपण एल्गोरिदम खोजने या लागू करने के लिए दिशा साझा या निर्देश दे सकता है।तेजी से छवि विरूपण एल्गोरिदम खोज रहे हैं

वास्तविक फिल्टर कि एल्गोरिथ्म लागू करता है:

public boolean sphereFilter(Bitmap b, boolean bSmoothing) 
{ 
    int nWidth = b.getWidth(); 
    int nHeight = b.getHeight(); 

    Point [][] pt = new Point[nWidth][nHeight]; 
    Point mid = new Point(); 
    mid.x = nWidth/2; 
    mid.y = nHeight/2; 

    double theta, radius; 
    double newX, newY; 

    for (int x = 0; x < nWidth; ++x) 
     for (int y = 0; y < nHeight; ++y) 
     { 
      pt[x][y]= new Point(); 
     } 

    for (int x = 0; x < nWidth; ++x) 
     for (int y = 0; y < nHeight; ++y) 
     { 
      int trueX = x - mid.x; 
      int trueY = y - mid.y; 
      theta = Math.atan2((trueY),(trueX)); 

      radius = Math.sqrt(trueX*trueX + trueY*trueY); 

      double newRadius = radius * radius/(Math.max(mid.x, mid.y)); 

      newX = mid.x + (newRadius * Math.cos(theta)); 

      if (newX > 0 && newX < nWidth) 
      { 
       pt[x][y].x = (int) newX; 
      } 
      else 
      { 
       pt[x][y].x = 0; 
       pt[x][y].y = 0; 
      } 

      newY = mid.y + (newRadius * Math.sin(theta)); 

      if (newY > 0 && newY < nHeight && newX > 0 && newX < nWidth) 
      {     
       pt[x][ y].y = (int) newY; 
      } 
      else 
      { 
       pt[x][y].x = pt[x][y].y = 0; 
      } 
     } 
    offsetFilterAbs(b, pt); 
    return true; 
} 

कोड कि परिकलित पिक्सल की स्थिति बदल देता है।

public boolean offsetFilterAbs(Bitmap b, Point[][] offset) 
{ 
     int nWidth = b.getWidth(); 
     int nHeight = b.getHeight(); 

     int xOffset, yOffset; 

     for(int y=0;y < nHeight;++y) 
     { 
      for(int x=0; x < nWidth; ++x) 
      { 
       xOffset = offset[x][y].x; 
       yOffset = offset[x][y].y; 

       if (yOffset >= 0 && yOffset < nHeight && xOffset >= 0 && xOffset < nWidth) 
       { 
        b.setPixel(x, y, b.getPixel(xOffset, yOffset)); 
       }     
      }    
     } 

    return true; 
} 
+0

[छवि वारिंग - बल्गे प्रभाव एल्गोरिदम] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/5055625/image-warping-bulge-effect-algorithm) –

+0

हां, यह बहुत अधिक डुप्लिकेट है, लेकिन ध्यान दें कि उस प्रश्न का स्वीकार्य उत्तर * नहीं * वास्तव में वह है जिसे आप यहां चाहते हैं - जो आप चाहते हैं वह जीएलएसएल शेडर है। –

+0

@ ब्लूराजा, मैं वर्तमान में आपके लिंक पर पहले से ही एक ही एल्गोरिदम का उपयोग कर रहा हूं और यह अभी भी एंड्रॉइड डिवाइस – Tony

उत्तर

5

मैं वर्तमान में पहले से ही आपके लिंक पर एक साथ एक ही कलन विधि का उपयोग कर रहा हूँ और यह अभी भी android उपकरणों

के लिए बहुत धीमी गति से से है मेरी link in the comments above:

 
Given 
r = Sqrt((x - 0.5)^2 + (y - 0.5)^2) 
a = ArcTan2(y - 0.5, x - 0.5) 
n = Bulge factor (default = 1) 

Set 
x' = r^n * Cos(a) + 0.5 
y' = r^n * Sin(a) + 0.5 

(याद रखें कि, इस समीकरण में, x और y 0 से 1 तक फैला है। यदि आपके आयाम 0 से 0 तक फैले हैं w, की जगह w/2 साथ 0.5)

a bit of math का उपयोग करना, हम देख सकते हैं कि

 
Cos(a) = Cos(ArcTan2(y - 0.5, x - 0.5)) 
     = (x - 0.5)/r 
Sin(a) = Sin(ArcTan2(y - 0.5, x - 0.5)) 
     = (y - 0.5)/r 

इस अंतिम जिसके परिणामस्वरूप समीकरण

 
r = (x - 0.5)^2 + (y - 0.5)^2 
n = Bulge factor (default = 0) 

Set 
x' = r^n * (x - 0.5) + 0.5 
y' = r^n * (y - 0.5) + 0.5 

(मैं वर्ग जड़ हटा दिया क्योंकि हम ले बनाता है किसी भी वास्तविक शक्ति के परिणामस्वरूप ... वास्तव में यह समकक्ष बनाने के लिए हमें के बजाय n/2 का उपयोग करना चाहिए, लेकिन si nce हम परिभाषित कर रहे हैं "उभार-कारक," हम सिर्फ बाहर अतिरिक्त विभाजन छोड़ सकते हैं)

केवल गुणा और एक भी वास्तविक घातांक के एक मुट्ठी भर के साथ, यह शायद सबसे तेजी से आप प्राप्त करने की उम्मीद कर सकते हैं।

+1

+1 मैं इसका उत्तर नहीं दे रहा हूं क्योंकि मेरा एंड्रॉइड-फू शून्य है। लेकिन शायद ओपी को अपने कोड पर कुछ बुनियादी प्रोफाइलिंग करने की कोशिश करनी चाहिए और देखें कि कौन से प्रमुख उपभोक्ता हैं। या शायद अनावश्यक ट्रिग ऑप्स का उन्मूलन पर्याप्त है। –

+0

@ belisarius मैंने अपने कोड और दोनों कार्यों को प्रोफाइल करने की कोशिश की है (नए एक्स, वाई पदों की गणना और उन्हें बदलने) प्रत्येक के लिए लगभग 2000ms लेता है जो "पिक्से प्रो" की तुलना में बहुत खराब है। – Tony

+1

@ टोनी * पिक्से प्रो * शायद यह ओपनजीएल का उपयोग कर ... और हजारों अनावश्यक 'प्वाइंट 'ऑब्जेक्ट्स बनाये बिना करता है। –

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