2014-04-21 10 views
7

मैंने एक एंड्रॉइड गतिविधि लिखी है जो प्रोग्राम को प्रोग्राम रूप से कैप्चर करता है। मैं छवि को सही EXIF ​​अभिविन्यास डेटा के साथ एक जेपीईजी के रूप में सहेजना चाहता हूं (जैसे देशी एंड्रॉइड कैमरा ऐप स्वचालित रूप से करता है)। ,एंड्रॉइड फोटो EXIF ​​अभिविन्यास सेट करना

private Camera.PictureCallback jpgCallback = new Camera.PictureCallback() { 
    public void onPictureTaken(byte[] data, Camera camera) { 

     releaseCamera(); 
     savePhoto(data); 
}; 

तस्वीर ठीक से लिया जाता है:

private void takePhoto() { 

    camera = Camera.open(); 
    SurfaceTexture dummySurfaceTexture = new SurfaceTexture(0); 
    camera.setPreviewTexture(dummySurfaceTexture); 
    camera.startPreview(); 
    camera.takePicture(null, null, jpgCallback); 
} 

... और कॉलबैक:

यहाँ (मैं ट्राई/कैच ब्लॉक हटाया) वास्तव में तस्वीर लेने के लिए विधि है लेकिन मेरी समस्या यह है कि EXIF ​​डेटा से पता चलता है कि डिवाइस के अभिविन्यास के बावजूद अभिविन्यास "छवि अभिविन्यास: शीर्ष, बाएं हाथ" पर सेट है, ताकि जब मैं फोटो अपलोड करता हूं तो यह उल्टा या घूर्णन दिखाई देता है।

क्या मुझे वास्तव में डिवाइस अभिविन्यास को मैन्युअल रूप से कैप्चर करने की आवश्यकता है (रोल, पिच, अजीमुथ) और EXIF ​​अभिविन्यास स्वयं लिखें? कैमरा ऐप स्वचालित रूप से इस डेटा को सही तरीके से कैसे लिखता है? क्या किसी को इस विशेषता को सही तरीके से सेट करने का तरीका पता है?

संपादित करें: मैं स्क्रीन अभिविन्यास का उपयोग नहीं कर सकता क्योंकि गतिविधि पोर्ट्रेट मोड में बंद है।

+0

मैंने पहले ही यह जवाब पढ़ा है, लेकिन इसका उपयोग नहीं किया जा सकता क्योंकि मेरी गतिविधि पोर्ट्रेट मोड में बंद है। https://stackoverflow.com/questions/13245556/exif-orientation-tag-value-always-0-for-image-taken-with-portrait-camera-app-and/13323987#13323987 –

उत्तर

-2
ExifInterface exif; 
     try { 
      exif = new ExifInterface(filePath); 

      int orientation = exif.getAttributeInt(
        ExifInterface.TAG_ORIENTATION, 0); 
      Log.d("EXIF", "Exif: " + orientation); 
      Matrix matrix = new Matrix(); 
      if (orientation == 6) { 
       matrix.postRotate(90); 
       Log.d("EXIF", "Exif: " + orientation); 
      } else if (orientation == 3) { 
       matrix.postRotate(180); 
       Log.d("EXIF", "Exif: " + orientation); 
      } else if (orientation == 8) { 
       matrix.postRotate(270); 
       Log.d("EXIF", "Exif: " + orientation); 
      } 
14

आप EXIF ​​उन्मुखीकरण खुद लिखने के लिए नहीं है, लेकिन आप यह बताने के लिए कैमरा अपने डिवाइस का अभिविन्यास सबसिस्टम इससे पहले कि आप एक तस्वीर लेने की क्या ज़रूरत है। इसके पास उस जानकारी तक पहुंच नहीं है। एक बार सेट हो जाने पर, कैमरा उपप्रणाली या तो EXIF ​​फ़ील्ड सेट करेगी या छवि डेटा को सही ढंग से उन्मुख करने के लिए छवि डेटा घुमाएगी (जो किया जाता है आपके विशिष्ट डिवाइस पर निर्भर करता है)।

कैमरा उन्मुखीकरण आप अपने अभी भी चित्रों के लिए चाहते हैं कहता हूं, Camera.Parameters.setRotation() का उपयोग करें:

वहाँ कैसे इसे सही ढंग से जो थोड़ा मुश्किल है उपयोग करने के लिए, क्योंकि आपके द्वारा सेट मूल्य निर्भर करता है के लिए डेवलपर दस्तावेज़ में संदर्भ कोड है 1) आपके कैमरे सेंसर का अभिविन्यास और 2) डिवाइस के सामान्य अभिविन्यास के सापेक्ष, आपके यूआई का अभिविन्यास।

public void onOrientationChanged(int orientation) { 
    if (orientation == ORIENTATION_UNKNOWN) return; 
    android.hardware.Camera.CameraInfo info = 
     new android.hardware.Camera.CameraInfo(); 
    android.hardware.Camera.getCameraInfo(cameraId, info); 
    orientation = (orientation + 45)/90 * 90; 
    int rotation = 0; 
    if (info.facing == CameraInfo.CAMERA_FACING_FRONT) { 
    rotation = (info.orientation - orientation + 360) % 360; 
    } else { // back-facing camera 
    rotation = (info.orientation + orientation) % 360; 
    } 
    mParameters.setRotation(rotation); 
} 

फिर अपने takePicture कॉल करने से पहले, आप Camera.setParameters (mParameters) कॉल करने की आवश्यकता: मैं जो एक OrientationEventListener का उपयोग करता है और मानता है कि आप एक Camera.Parameters वस्तु बुलाया mParameters है नमूना कोड यहाँ, कॉपी किया है।

अपने विशिष्ट मामले में, आप उन्मुखीकरण क्वेरी सही इससे पहले कि आप चित्र ले सकते हैं और रोटेशन गणना करने के लिए नमूना कोड में तर्क का उपयोग करना चाहते हो सकता है। और उसके बाद कैमरा .getParameters() के साथ कैमरा पैरामीटर प्राप्त करें, setRotation कॉल करें, और उसके बाद कैमरा.सेट पैरामीटर() को कॉल करें।

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