2015-09-26 9 views
8

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

enter image description here

मैं इस परिणाम प्राप्त कर सकते हैं?

उत्तर

17

मुझे अपनी समस्या को हल करने के लिए सर्वोत्तम प्रथाओं या सलाह भी ढूंढने में कठिनाई थी। this anwer by JannGabriel के आधार पर, जो छवि आकार को कम करके छवि को दाएं और नीचे फसल करता है, मैं एक कदम आगे बढ़ाने में कामयाब रहा हूं और शीर्ष और बाएं रिक्त स्थान को भी हटा देता हूं, और आम तौर पर विस्तार समय में सुधार करता हूं। नतीजा अच्छा है, और मैं वर्तमान में इसे अपने प्रोजेक्ट में उपयोग कर रहा हूं। मैं एंड्रॉइड प्रोग्रामिंग के लिए काफी नया हूं और इस विधि पर कोई सलाह स्वागत है।

public static Bitmap TrimBitmap(Bitmap bmp) { 
    int imgHeight = bmp.getHeight(); 
    int imgWidth = bmp.getWidth(); 


    //TRIM WIDTH - LEFT 
    int startWidth = 0; 
    for(int x = 0; x < imgWidth; x++) { 
     if (startWidth == 0) { 
      for (int y = 0; y < imgHeight; y++) { 
       if (bmp.getPixel(x, y) != Color.TRANSPARENT) { 
        startWidth = x; 
        break; 
       } 
      } 
     } else break; 
    } 


    //TRIM WIDTH - RIGHT 
    int endWidth = 0; 
    for(int x = imgWidth - 1; x >= 0; x--) { 
     if (endWidth == 0) { 
      for (int y = 0; y < imgHeight; y++) { 
       if (bmp.getPixel(x, y) != Color.TRANSPARENT) { 
        endWidth = x; 
        break; 
       } 
      } 
     } else break; 
    } 



    //TRIM HEIGHT - TOP 
    int startHeight = 0; 
    for(int y = 0; y < imgHeight; y++) { 
     if (startHeight == 0) { 
      for (int x = 0; x < imgWidth; x++) { 
       if (bmp.getPixel(x, y) != Color.TRANSPARENT) { 
        startHeight = y; 
        break; 
       } 
      } 
     } else break; 
    } 



    //TRIM HEIGHT - BOTTOM 
    int endHeight = 0; 
    for(int y = imgHeight - 1; y >= 0; y--) { 
     if (endHeight == 0) { 
      for (int x = 0; x < imgWidth; x++) { 
       if (bmp.getPixel(x, y) != Color.TRANSPARENT) { 
        endHeight = y; 
        break; 
       } 
      } 
     } else break; 
    } 


    return Bitmap.createBitmap(
      bmp, 
      startWidth, 
      startHeight, 
      endWidth - startWidth, 
      endHeight - startHeight 
    ); 

} 

स्पष्टीकरण: छवि के प्रत्येक पक्ष के लिए, पाश के लिए एक पिक्सल है पारदर्शी रंग शामिल नहीं करता है, तो जाँच करने के लिए, पहली गैर पारदर्शी पिक्सेल उपयोगी समन्वय लौटने चलाया जाता है। यह आयाम को मापने के आयाम की तुलना में विपरीत आयाम के आधार के रूप में विस्तृत समन्वय का उपयोग किया जाता है: y खोजने के लिए, प्रत्येक वाई के लिए x स्कैन करें। जहां कार्यक्षेत्र टॉप रिक्त स्थान समाप्त हो जाती है

जाँच करने के लिए, यह निम्न चरणों को चलाता है:

  1. शुरू शीर्ष पंक्ति से है (y = 0)
  2. चेकों सभी पंक्ति के कॉलम (एक्स 0 से imageWidth तक)
  3. यदि कोई गैर-पारदर्शी पिक्सेल पाया जाता है, तो लूप को तोड़ें और y समन्वय को सहेजें। अन्यथा जारी रखें।
  4. कॉलम के अंत में, अगली पंक्ति (y + 1) पर जाएं और कॉलम दोबारा जांचना शुरू करें। एक गैर पारदर्शी पिक्सेल पहले से ही पाया गया है तो तोड़ो।

अन्य आयामों के लिए समान तरीकों का उपयोग किया जाता है, केवल स्कैन की दिशा बदलता है।

एक बार छवि के पहले उपयोगी पिक्सल के लिए 4 निर्देशांक प्राप्त की, Bitmap.createBitmap विधि एक आधार छवि के रूप में मूल बिटमैप के साथ शुरू हो जाती है, और उपयोगी पिक्सल आकार बदलने के लिए के रूप में ऊपरी-बाईं ओर और नीचे-दाएं सीमा निर्देशांक ।

नोट 1: यह उपयोगी है ध्यान दें कि निर्देशांक 0, 0 ऊपरी-बाईं ओर के बराबर है।

नोट 2: बिटमैप.क्रेट बिटमैप में अंत चौड़ाई और ऊंचाई नए प्रारंभिक सापेक्ष समन्वय से कम हो जाती है, अन्यथा नई छवि में सीमाएं गलत तरीके से नीचे-दाएं होंगी। इसे इस तरह चित्रित करें: आपके पास एक छवि 100x100px है, इसलिए समन्वय समाप्त करने के साथ 100,100। प्रारंभिक निर्देशांक को 50,50 में बदलना आपके विस्तार आयत के अंतिम समन्वय को 150,150 (संशोधित प्रारंभ बिंदु के 100 मूल समन्वय + 50) तक ले जाएगा, जो इसे मूल छवि सीमाओं के बाहर धक्का दे रहा है। इससे बचने के लिए, नए समापन समन्वय को नए प्रारंभिक समन्वय (100 + 50 नए प्रारंभिक समन्वय - 50 नए प्रारंभिक समन्वय समायोजन)

नोट 3: मूल उत्तर में दिए गए सभी पिक्सेल के लिए एक चेक सबसे उन्नत उपयोगी पिक्सेल लौटने, खोजने के लिए निर्देशांक के समान आयाम का उपयोग करके दिशा चलायी जाती है।विपरीत आयाम की जांच करना और पहले उपयोगी पिक्सेल में रोकना प्रदर्शन में वृद्धि हुई।

+1

आपका नमूना कोड कम से कम एक पिक्सेल ट्रिम करेगा, भले ही छवि में कोई पारदर्शी कॉलम या पंक्ति न हो। 'If ​​(startWidth == 0) 'और अन्य कथन जैसे' http: // stackoverflow.com/a/886979/1043882' में वर्णित तरीके का उपयोग करना बेहतर है। – hasanghaforian

+0

'startWidth' और' startHeight' को प्रारंभ में 0 पर सेट नहीं किया जाना चाहिए, क्योंकि यदि आपकी छवि में शीर्ष पर और बाईं ओर खाली स्थान नहीं है तो आपके फॉर-लूप अंत तक चलेंगे। तो आप '2 * चौड़ाई * ऊंचाई' के बराबर गणना समय बर्बाद कर देंगे। मुझे लगता है कि उन्हें '-1' पर सेट करना बेहतर है। – Ruslan

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