2012-07-26 9 views
13

के साथ एंड्रॉइड छवि अभिविन्यास समस्या मैंने इरादे छवि कैप्चर को कॉल करते समय कुछ एंड्रॉइड डिवाइसों के साथ कुछ मुद्दों को संभालने के लिए एक कस्टम कैमरा गतिविधि लिखा। उपयोगकर्ता या तो छवि को सहेजने में सक्षम है या OnPictureTakenCallback से वापस लौटाए गए डेटा का उपयोग करने में सक्षम है।कस्टम कैमरा गतिविधि

मेरी समस्या यह है कि जिस समस्या को मैं लिया गया था उसके संबंध में छवि को सही ढंग से प्रदर्शित कर रहा है। मैं SetRequestedOrientation पर कॉल करके चित्र में चित्र को प्रदर्शित करने के लिए मजबूर करता हूं।

उपयोगकर्ता को चित्र लेने के दौरान कैमरे में सही ओरिएंटेशन कैसे पता चलेगा? यानी उपयोगकर्ता 90 (चित्र) के घूर्णन पर तस्वीर ले सकता है।

मैंने विंडो प्रबंधक के डिफ़ॉल्ट प्रदर्शन पर getRotation() का उपयोग करने का प्रयास किया है, लेकिन अनुरोधित ओरिएंटेशन को पोर्ट्रेट पर सेट करने के साथ ही केवल Surface.ROTATION_0 लौटाता है।

अद्यतन: मेरी अन्य समस्या को स्पष्ट करने के लिए, अगर मैं छवि को सहेजना नहीं चाहता तो चित्र कॉलबैक में केवल byte[] डेटा से अभिविन्यास निर्धारित कर सकता हूं?

अद्यतन: इस कोड के साथ नीचे दिए गए उत्तरों का प्रयास करने के बाद मुझे जो कुछ मिल रहा है वह ExifInterface.ORIENTATION_NORMAL है। मैंने कैमरे से लौटाई गई फ़ाइल को सहेजने के लिए अपना कोड भी बदल दिया है क्योंकि मुझे यकीन नहीं है कि byte[] डेटा के साथ अभिविन्यास निर्धारित करने का एक आसान तरीका है।

private PictureCallback mPicture = new PictureCallback() 
    { 
     @Override 
     public void onPictureTaken(byte[] data, Camera camera) 
     { 
      File directory = new File(android.os.Environment.getExternalStoragePublicDirectory(android.os.Environment.DIRECTORY_PICTURES), 
        "MyApp"); 
      if(!directory.exists()) 
      { 
       if(!directory.mkdirs()) 
       { 
        Log.d("CAMERA", "Unable to create directory to save photos."); 
        return; 
       } 
      } 
      File file = new File(directory.getPath() + file.separator + "IMG_" + SimpleDateFormat.getDateTimeInstance().toString() + ".jpg"); 
      FileOutputStream fos = new FileOutputStream(file); 
      fos.write(data); 
      fos.close(); 
      ExifInterface exif = new ExifInterface(file.getCanonicalPath()); 
      int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); 
      int rotate = 0; 

      switch (orientation) 
      { 
       case ExifInterface.ORIENTATION_ROTATE_90: 
        rotate = 90; 
        break; 
       case ExifInterface.ORIENTATION_ROTATE_180: 
        rotate = 180; 
        break; 
       case ExifInterface.ORIENTATION_ROTATE_270: 
        rotate = 270; 
        break; 
       case default: 
        break; 
      } 
     } 
    }; 
+0

कर सकते हैं किसी भी एक मदद http://stackoverflow.com/questions/28379130/how -to-set-camera-image-ओरिएंटेशन –

उत्तर

15

अतः आप कैमरे के उन्मुखीकरण के साथ कुछ मुद्दे का सामना कर रहे। http://labs.makemachine.net/2010/03/simple-android-photo-capture/

शायद तुम कुछ इस तरह कर रही द्वारा उन्मुखीकरण फिक्सिंग की कोशिश करनी चाहिए:

यह लिंक एक साधारण कैमरा कब्जा गतिविधि का एक उदाहरण से पता चलता एप्लिकेशन

  ExifInterface exif = new ExifInterface(_path); 
      int exifOrientation = exif.getAttributeInt(
      ExifInterface.TAG_ORIENTATION, 
      ExifInterface.ORIENTATION_NORMAL); 

      int rotate = 0; 

      switch (exifOrientation) { 
      case ExifInterface.ORIENTATION_ROTATE_90: 
      rotate = 90; 
      break; 

     case ExifInterface.ORIENTATION_ROTATE_180: 
     rotate = 180; 
     break; 

     case ExifInterface.ORIENTATION_ROTATE_270: 
     rotate = 270; 
     break; 
     } 

      if (rotate != 0) { 
      int w = bitmap.getWidth(); 
      int h = bitmap.getHeight(); 

// Setting pre rotate 
      Matrix mtx = new Matrix(); 
      mtx.preRotate(rotate); 

     // Rotating Bitmap & convert to ARGB_8888, required by tess 
     bitmap = Bitmap.createBitmap(bitmap, 0, 0, w, h, mtx, false); 
     bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true); 
     } 
+0

मेरे लिए काम कर रहा है .. इसे फिर से दबा रहा है: http://labs.makemachine.net/2010/03/simple-android-photo-capture/ – Android2390

+0

मैंने अपना प्रश्न अपडेट कर लिया है आपके उत्तर के जवाब में। – Bryan

+1

मैंने पिक्चरकैब विधि में तस्वीर घूर्णन के लिए इस कोड का उपयोग किया है, लेकिन कुछ कैसे काम नहीं कर रहे हैं, क्या आप मेरी मदद कर सकते हैं मैं मदद के लिए आपको वोट दूंगा – Nitin

4

आप उन्मुखीकरण जिसमें चित्र लिया गया था सत्यापित करने के लिए मूल जेपीईजी से मेटाडाटा को पढ़ने के लिए की आवश्यकता होगी।

ExifInterface exif = new ExifInterface(SourceFileName); 
String exifOrientation = exif.getAttribute(ExifInterface.TAG_ORIENTATION); 

स्रोत: How to determine orientation of picture without ExifInterface?

संपादित करें: अपना संपादन का जवाब है, तो आप विधि getCameraInfo() कि कॉलबैक में पारित कैमरा वस्तु के साथ उपलब्ध है का उपयोग कर की कोशिश की? क्या आपके पास आवश्यक जानकारी है?

स्रोत: http://developer.android.com/reference/android/hardware/Camera.html

+0

आपको CameraInfo पर "ओरिएंटेशन" कॉल करने में सक्षम होना चाहिए। http://developer.android.com/reference/android/hardware/Camera.CameraInfo।एचटीएमएल – bsempe

+0

दस्तावेज़ों के अनुसार, यह एपीआई स्तर 9 के बाद से उपलब्ध है, यानी एंड्रॉइड 2.3। मेरा ऐप न्यूनतम एपीआई स्तर 8. – Bryan

3

निकाला जा रहा है setRequestedOrientation() अनुमति getWindowManager().getDefaultDisplay().getRotation() देने के लिए सही घूर्णन। मुझे लगता है कि अनुरोधित अभिविन्यास को सेट करने से गतिविधि को तब से पुनर्निर्मित करने से रोकता है जब कॉन्फ़िगरेशन में परिवर्तन होता है, इस प्रकार डिवाइस को किसी प्रकार का रोटेशन नहीं बदला जाता है। मेरी केवल मुद्दा अब लैंडस्केप मोड 180 डिग्री रोटेशन के 0 डिग्री उन्मुखीकरण पर लैंडस्केप मोड से स्विच कर रहा है इस आग नहीं करता है:

@Override 
public void onConfigurationChanged(Configuration newconfig) 
{ 
    super.onConfigurationChanged(newconfig); 

} 
3
public void surfaceCreated(SurfaceHolder holder) { 
    try { 
     mCamera.setPreviewDisplay(holder); 
     Camera.Parameters parameters = mCamera.getParameters(); 
     if (this.getResources().getConfiguration().orientation != 
       Configuration.ORIENTATION_LANDSCAPE) 
     { 
      parameters.set("orientation", "portrait"); <----THis gets the job done!!! 
      // For Android Version 2.2 and above 
      mCamera.setDisplayOrientation(90); 
      // For Android Version 2.0 and above 
      parameters.setRotation(90); 
     } 


     // End Effects for Android Version 2.0 and higher 
     mCamera.setParameters(parameters); 
    } 
    catch (IOException exception) 
    { 
     mCamera.release(); 
    } 

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