2011-12-22 16 views
17

मैं एक लैंडमैप छवि 90 डिग्री को एक लैंडस्केप स्वरूप से एक पोर्ट्रेट प्रारूप में बदलने के लिए घुमाने की कोशिश कर रहा हूं। उदाहरण:एंड्रॉइड स्क्वैश छवि में बिटमैप 90 डिग्री परिणाम घुमाएं। चित्र और परिदृश्य के बीच एक सच्चे घुमाव की आवश्यकता है

[क, ख, ग, घ]
[ई, एफ, जी, एच]
[i, j, k, l]

घुमाया 90 डिग्री दक्षिणावर्त

हो जाता है [मैं, ई, एक]
[j, एफ, ख]
[k, जी, सी]
[एल, एच, डी]

(एक ऑनलाइन उदाहरण से) नीचे दिए गए कोड का उपयोग कर छवि 90 डिग्री घुमाया गया है लेकिन टी को बरकरार रखता है वह परिदृश्य पहलू अनुपात है ताकि आप एक लंबवत squashed छवि के साथ खत्म हो। क्या मुझसे कुछ गलत हो रही है? क्या मुझे कोई और तरीका उपयोग करने की ज़रूरत है? मैं jpeg फ़ाइल को घुमाने के लिए भी तैयार हूं जिसे मैं बिटमैप बनाने के लिए उपयोग कर रहा हूं यदि यह आसान है।

Matrix matrix = new Matrix(); 
matrix.postRotate(90); 
rotated = Bitmap.createBitmap(original, 0, 0, 
           original.getWidth(), original.getHeight(), 
           matrix, true); 

अपने कोड में:

// create a matrix for the manipulation 
Matrix matrix = new Matrix(); 
// resize the bit map 
matrix.postScale(scaleWidth, scaleHeight); 
// rotate the Bitmap 
matrix.postRotate(90); 

// recreate the new Bitmap 
Bitmap resizedBitmap = Bitmap.createBitmap(bitmapOriginal, 0, 0, widthOriginal, heightOriginal, matrix, true); 
+0

सुनिश्चित नहीं है कि मैं आपके प्रश्न को सही तरीके से समझता हूं। क्या अभिविन्यास बदलते समय आप स्क्रीन लेआउट को घुमाने के लिए चाहते हैं? या क्या आप स्क्रीन लेआउट को बदलना चाहते हैं भले ही अभिविन्यास नहीं बदले? (जब अभिविन्यास बदलता है तो एंड्रॉइड स्वचालित रूप से स्क्रीन तत्वों को घुमाता है!) – Ahmed

+0

इसलिए मैं बिटमैप डेटा को स्वयं बदलना चाहता हूं। मेरे ऐप में कैमरा तस्वीर को अनुचित रूप से संग्रहीत कर रहा है ताकि अगर "चित्र" अभिविन्यास में कोई चित्र लिया गया हो, फिर भी इसे "परिदृश्य" अभिविन्यास में लोड किया जाता है। मैं फ़ाइल के EXIF ​​डेटा के माध्यम से सही अभिविन्यास का पता लगाने में सक्षम हूं और मैं बिटमैप को उचित अभिविन्यास पर घुमाने के लिए चाहता हूं। मैं बस बदलना नहीं चाहता कि बिटमैप कैसे प्रदर्शित होता है लेकिन वास्तविक डेटा को बदलता है ताकि छवि को संशोधित करने के बाद इसे ठीक से बचाया जा सके। – user999764

उत्तर

13

यहाँ कैसे आप इसे ठीक से बारी बारी से करेंगे

public static Bitmap rotate(Bitmap b, int degrees) { 
    if (degrees != 0 && b != null) { 
     Matrix m = new Matrix(); 

     m.setRotate(degrees, (float) b.getWidth()/2, (float) b.getHeight()/2); 
     try { 
      Bitmap b2 = Bitmap.createBitmap(
        b, 0, 0, b.getWidth(), b.getHeight(), m, true); 
      if (b != b2) { 
       b.recycle(); 
       b = b2; 
      } 
     } catch (OutOfMemoryError ex) { 
      throw ex; 
     } 
    } 
    return b; 
} 
+0

धन्यवाद टोलगा, मैं आज रात कोशिश करूंगा। – user999764

+0

कोई समस्या नहीं, जब मैं इसे देख रहा था, मैंने इसे जिस तरह से किया था (संभवतः उसी उदाहरण का उपयोग किया) अंततः कोड के साथ आया जो मैंने उचित रोटेशन –

+0

हम्म के लिए पोस्ट किया था, यह घूर्णन है लेकिन अभी भी लंबवत squashed हो रहा है। पहले की तरह ही। – user999764

41

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

+0

यदि आप एक घुमावदार छवि को मूल से अधिक ऊंचाई (जैसे यह होना चाहिए) बनाना चाहते हैं, तो आपको एक अपवाद 'java.lang.IllegalArgumentException: y + ऊंचाई <= bitmap.height() 'होना चाहिए। तो, मूल से बिटमैप बड़ा मत बनो। – CoolMind

0

इस कोड मेरे लिए महान काम किया:

   Matrix matrix = new Matrix(); 

      matrix.setRotate(90, 0, 0); 
      matrix.postTranslate(original.getHeight(), 0); 

      rotatedBitmap = Bitmap.createBitmap(newWidth, newHeight, original.getConfig()); 
      Canvas tmpCanvas = new Canvas(rotatedBitmap); 
      tmpCanvas.drawBitmap(original, matrix, null); 
      tmpCanvas.setBitmap(null); 
0

जांच कैनवास आकार जहां बिटमैप आकर्षित, हो सकता है आपके कैनवास अभी भी परिदृश्य है, इसलिए केवल घुमाया बिटमैप के वर्ग हिस्सा देखा जा सकता है।

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