2011-09-02 14 views
46

मेरे पास यह कोड है:एंड्रॉइड एक कैमरा बिटमैप का अभिविन्यास प्राप्त करें? और वापस -90 डिग्री घुमाएं

//choosed a picture 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 

    if (resultCode == RESULT_OK) { 
     if (requestCode == ImageHelper.SELECT_PICTURE) { 

      String picture   = ""; 

      Uri selectedImageUri  = data.getData(); 
      //OI FILE Manager 
      String filemanagerstring = selectedImageUri.getPath(); 
      //MEDIA GALLERY 
      String selectedImagePath = ImageHelper.getPath(mycontext, selectedImageUri); 

      picture=(selectedImagePath!=null)?selectedImagePath:filemanagerstring; 

...

यह गैलरी से केवल एक तस्वीर चयनकर्ता है। यह अच्छा है, लेकिन जब मैं इस तस्वीर को एक छविदृश्य पर खोलता हूं, तो कैमरे के साथ "पोर्ट्रेट मोड" पर ली गई छवियां अच्छी लगती हैं, लेकिन छवियों ने कैमरे के साथ "लैंडस्केप मोड" लिया, -90 डिग्री में खुलता है।

मैं उन तस्वीरों को वापस कैसे घुमा सकता हूं?

 Bitmap output  = Bitmap.createBitmap(newwidth, newheight, Config.ARGB_8888); 
    Canvas canvas  = new Canvas(output); 

मैंने यह कोशिश की:

Log.e("w h", bitmap.getWidth()+" "+bitmap.getHeight()); 
if (bitmap.getWidth()<bitmap.getHeight()) canvas.rotate(-90); 

लेकिन यह काम नहीं कर रहा है, सभी छवि आकार है: * 2560 1920 पिक्सेल (पोर्ट्रेट, और लैंडस्केप मोड सभी)

मैं क्या कर सकता हूं लैंडस्केप चित्रों को घुमाएं?

धन्यवाद लेस्ली

उत्तर

178

एक तस्वीर एक डिजिटल कैमरा या स्मार्टफोन के साथ लिया जाता है, रोटेशन अक्सर तस्वीर के Exif डेटा में संग्रहित है, छवि फ़ाइल के भाग के रूप। आप Android ExifInterface का उपयोग कर किसी छवि के Exif मेटा-डेटा को पढ़ सकते हैं।

पहले, बनाने ExifInterface:

ExifInterface exif = new ExifInterface(uri.getPath()); 

इसके बाद, वर्तमान रोटेशन लगता है: डिग्री

int rotation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); 

Convert exif रोटेशन:

int rotationInDegrees = exifToDegrees(rotation); 

जहां

private static int exifToDegrees(int exifOrientation) {   
    if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_90) { return 90; } 
    else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_180) { return 180; } 
    else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_270) { return 270; }    
    return 0;  
} 

फिर Matrix का उपयोग करके छवि को घुमाने के लिए संदर्भ बिंदु के रूप में छवि के वास्तविक रोटेशन का उपयोग करें।

Bitmap.createBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter) 

जहां Matrix m नई रोटेशन रखती है::

Bitmap adjustedBitmap = Bitmap.createBitmap(sourceBitmap, 0, 0, width, height, matrix, true); 

के लिए इन ट्यूटोरियल देखें

Matrix matrix = new Matrix(); 
if (rotation != 0f) {matrix.preRotate(rotationInDegrees);} 

आपको लगता है कि एक पैरामीटर के रूप में एक Matrix ले Bitmap.createBitmap विधि के साथ नई छवि बनाने घुमाया उपयोगी स्रोत कोड उदाहरण:

+0

ग्रेट उत्तर लेकिन मैट्रिक्स में int "रोटेशन" का उपयोग कैसे करते हैं? – Cole

+0

@ कोल - मैंने मैट्रिक्स के साथ रोटेशन चर का उपयोग करने के तरीके के बारे में एक स्पष्टीकरण शामिल करने के लिए अपना उत्तर संपादित किया है। –

+2

इस तरह के एक पूर्ण जवाब के लिए धन्यवाद! – Cole

0

अंतिम उत्तर तकनीकी रूप से सही था, लेकिन मैंने छवि दृश्यों में चित्रों को घुमाने, घुमाने, आकार बदलने, कैश करने और लोड करने के लिए एक प्रणाली बनाने के लिए कड़ी मेहनत की और मैं यह कह सकता हूं कि यह नरक है।यहां तक ​​कि जब यह सब किया गया था तब भी कभी-कभी दुर्घटनाएं कुछ उपकरणों में आउटऑफमेमरी का कारण बनती हैं।

मेरा बिंदु पहिया को फिर से नहीं चलाता है, यह एक आदर्श डिजाइन है। Google आपको Glide का उपयोग करने के लिए प्रोत्साहित करता है। यह एक पंक्ति में काम करता है, उपयोग करने में बहुत आसान, आकार में हल्के वजन और कार्य संख्या, यह डिफ़ॉल्ट द्वारा EXIF ​​का प्रबंधन करता है, और यह स्मृति की तरह स्मृति का उपयोग करता है .. यह केवल काले जादू कोडित है;)

मैं हूं Picasso भी EXIF ​​का प्रबंधन करता है, लेकिन वहाँ उन दोनों के लिए एक त्वरित परिचय है नहीं यकीन है कि अगर:

https://inthecheesefactory.com/blog/get-to-know-glide-recommended-by-google/en

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

Glide.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView); 
+0

हाँ, लेकिन समस्या यह है कि, यदि आपने नमूना डीकोड/डाउन किया है उदाहरण के लिए थोड़ा या जेपीजी प्रारूप का उपयोग कर संपीड़ित। EXIF ​​संरक्षित नहीं है, इसलिए आपको विशेषताओं को नई फ़ाइल में रीसेट करने की आवश्यकता है। – ngatirauks

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