2012-11-17 12 views
8

में तस्वीर को 9 0 डिग्री घुमाएं फोटो फोटो सैमसंग मोबाइल बाकी अन्य मोबाइल (एचटीसी) में कैमरे से कैप्चर करते समय 90 डिग्री घूर्णन कर रहा है। कृपया इसके लिए मेरी मदद करें।सैमसंग मोबाइल

Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
startActivityForResult(cameraIntent, IMAGE_CAPTURE); 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
    super.onActivityResult(requestCode, resultCode, data);  
     try 
    { 
    if (requestCode == IMAGE_CAPTURE) { 
     if (resultCode == RESULT_OK){ 

     Uri contentUri = data.getData(); 
     if(contentUri!=null) 
     { 
     String[] proj = { MediaStore.Images.Media.DATA };   
      Cursor cursor = managedQuery(contentUri, proj, null, null, null);   
     int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);   
     cursor.moveToFirst();   
     imageUri = Uri.parse(cursor.getString(column_index)); 
     } 

     tempBitmap = (Bitmap) data.getExtras().get("data"); 
     mainImageView.setImageBitmap(tempBitmap); 
     isCaptureFromCamera = true; 
    } 
} 
+0

क्या आप चित्र छवि अभिविन्यास की अपेक्षा करते हैं? –

+0

नहीं, मैं छवि के समान अभिविन्यास की अपेक्षा करता हूं क्योंकि मैं पूर्व में पोर्ट्रेट मोड में फोटो कैप्चर करता हूं, फिर यह पोर्ट्रेट में होना चाहिए और परिदृश्य के लिए समान होना चाहिए .. कृपया मुझे मदद करें –

+1

विभिन्न एंड्रॉइड डिवाइसों पर कैमरे के पोर्ट्रेट अभिविन्यास के साथ कई अलग-अलग बग हैं, सैमसंग सहित। यदि केवल संभव हो, तो घुमावदार UI तत्वों का उपयोग करके लैंडस्केप ओरिएंटेशन और नकली पोर्ट्रेट मोड का उपयोग करें, क्योंकि स्टॉक कैमरा ऐप करता है। –

उत्तर

11

कुछ डिवाइस डिवाइस अभिविन्यास के अनुसार छवि घुमाते हैं।

इस कोड को अनुकूलित नहीं है, मैं सिर्फ तर्क कोड मेरी एक से पता चलता है:

यहाँ

मैं एक आम तरीका लिखने उन्मुखीकरण हो और सही पैमाने में छवि प्राप्त

public Bitmap decodeFile(String path) {//you can provide file path here 
     int orientation; 
     try { 
      if (path == null) { 
       return null; 
      } 
      // decode image size 
      BitmapFactory.Options o = new BitmapFactory.Options(); 
      o.inJustDecodeBounds = true; 
      // Find the correct scale value. It should be the power of 2. 
      final int REQUIRED_SIZE = 70; 
      int width_tmp = o.outWidth, height_tmp = o.outHeight; 
      int scale = 0; 
      while (true) { 
       if (width_tmp/2 < REQUIRED_SIZE 
         || height_tmp/2 < REQUIRED_SIZE) 
        break; 
       width_tmp /= 2; 
       height_tmp /= 2; 
      scale++; 
      } 
      // decode with inSampleSize 
      BitmapFactory.Options o2 = new BitmapFactory.Options(); 
      o2.inSampleSize = scale; 
      Bitmap bm = BitmapFactory.decodeFile(path, o2); 
      Bitmap bitmap = bm; 

      ExifInterface exif = new ExifInterface(path); 

      orientation = exif 
        .getAttributeInt(ExifInterface.TAG_ORIENTATION, 1); 

      Log.e("ExifInteface .........", "rotation ="+orientation); 

//   exif.setAttribute(ExifInterface.ORIENTATION_ROTATE_90, 90); 

      Log.e("orientation", "" + orientation); 
      Matrix m = new Matrix(); 

      if ((orientation == ExifInterface.ORIENTATION_ROTATE_180)) { 
       m.postRotate(180); 
//    m.postScale((float) bm.getWidth(), (float) bm.getHeight()); 
       // if(m.preRotate(90)){ 
       Log.e("in orientation", "" + orientation); 
       bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), 
         bm.getHeight(), m, true); 
       return bitmap; 
      } else if (orientation == ExifInterface.ORIENTATION_ROTATE_90) { 
       m.postRotate(90); 
       Log.e("in orientation", "" + orientation); 
       bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), 
         bm.getHeight(), m, true); 
       return bitmap; 
      } 
      else if (orientation == ExifInterface.ORIENTATION_ROTATE_270) { 
       m.postRotate(270); 
       Log.e("in orientation", "" + orientation); 
       bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), 
         bm.getHeight(), m, true); 
       return bitmap; 
      } 
      return bitmap; 
     } catch (Exception e) { 
      return null; 
     } 

    } 

संपादित करने के लिए है परीक्षण परियोजना का।

+0

यह वास्तव में अच्छा समाधान है, और इसका काम ठीक है। बहुत बहुत धन्यवाद। – Hasmukh

+0

यह ठीक काम करता है लेकिन यह "आउट ऑफ़ मेमोरी अपवाद" देता है, जबकि मैं सैमसंग गैलेक्सी टैब 2 (7 ") में निरंतर स्नैपशॉट कैप्चर कर रहा हूं। कृपया आप कुछ समाधान दे सकते हैं। – Hasmukh

+0

@Hasmukh आप इस कोड में स्केल साइज बिटमैप बदल सकते हैं। इसे भरोसेमंद – dhams

0
public static Bitmap rotateBitmap(Bitmap b, float degrees) { 
    Matrix m = new Matrix(); 
    if (degrees != 0) { 
     // clockwise 
     m.postRotate(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) { 
     // We have no memory to rotate. Return the original bitmap. 
    } 
    return b; 
} 
0

तो यह वास्तव में एक बग है तो आप मैन्युअल रूप से इसे वापस करने के लिए परिदृश्य को घुमाने के लिए हो सकता है। बिटमैप डेटा में हमेशा चौड़ाई और ऊंचाई होती है, बस संख्याओं पर नज़र डालें और यदि चौड़ाई ऊंचाई से कम है तो छवि को एलिस्टेयर 3408 के उत्तर के अनुसार घुमाएं।

2

उपरोक्त समाधानों में आप जो भी जोड़ सकते हैं वह "samsung".contentEquals(Build.MANUFACTURER) है। यदि आप जानते हैं कि आपकी समस्या केवल सैमसंग उपकरणों के साथ है, तो आप उचित रूप से सुनिश्चित कर सकते हैं कि आपको वापस लौटाई गई छवि को घुमाने की आवश्यकता है (केवल) if ("samsung".contentEquals(Build.MANUFACTURER) && getActivity().getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT // && width > height//) // here you know you need to rotate

आप "उचित" विश्वास कर सकते हैं कि घूर्णन तब जरूरी है।

+0

इसका समाधान नहीं है। फोटो सैमसंग से हमेशा WIDTH> HEIGHT होता है। केवल पोर्ट्रेट मोड के साथ बग। – Peter