2012-06-22 19 views
14

पोर्ट्रेट मोड में, छवियां लंबवत रूप से फैली हुई हैं और लैंडस्केप मोड में यह क्षैतिज रूप से फैली हुई दिखती है।कैमरा सतह देखें छवियां देखें

हालांकि छवि को कैप्चर करने के बाद उचित आकार में दिखाई देता है।

इस समस्या को हल करने के लिए कैसे करें?

उत्तर

-3

यदि आप पूर्वावलोकन के बारे में बात कर रहे हैं, तो SurfaceView के आकार को कैमरे के पूर्वावलोकन आकार के समान सेट करने का प्रयास करें। इस तरह पूर्वावलोकन को स्केल नहीं किया जाना चाहिए।

8

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

यदि आपके पास पूर्ण-स्क्रीन दृश्य है, तो आपको यह पता लगाना चाहिए कि कैमरे का पूर्वावलोकन आकार उस आकार से मेल खाता है - कम से कम एक ही पहलू अनुपात वाला होगा। उदाहरण के लिए यदि आपकी स्क्रीन 640x480 है तो 320x240 पूर्वावलोकन आकार पूर्ण स्क्रीन SurfaceView पर प्रदर्शित नहीं होगा।

+0

पूर्वावलोकन आकार सेट करने के लिए मैं कोड निम्न का उपयोग कर रहा है लेकिन अभी भी सतह फैला दिखता है: निजी Camera.Size getBestPreviewSize (पूर्णांक चौड़ाई, पूर्णांक ऊंचाई, \t \t \t Camera.Parameters पैरामीटर) { \t \t कैमरा। आकार परिणाम = शून्य; \t के लिए \t (Camera.Size का आकार: parameters.getSupportedPreviewSizes()) { \t \t \t अगर (size.width <= चौड़ाई && size.height <= ऊंचाई) { \t \t \t \t अगर (परिणाम == बातिल) { \t \t \t \t \t परिणाम = आकार; \t \t \t \t} else { \t \t \t \t \t पूर्णांक resultArea = result.width * result.height; \t \t \t \t int newArea = size.width * आकार।ऊंचाई; \t \t \t \t \t अगर (newArea> resultArea) { \t \t \t \t \t \t परिणाम = आकार; \t \t \t \t \t} \t \t \t \t} \t \t \t} \t \t} \t \t वापसी (परिणाम); \t} – Manjeet

+0

आप इसे इस तरह क्यों कर रहे हैं? बस पहले एक साधारण सटीक मैच की तलाश करें। ऐसा लगता है कि आप बारकोड स्कैनर से बहुत पुराने कोड की प्रतिलिपि बना रहे हैं। –

3

मैं() camera.startPreview कॉल करने से पहले इस जोड़कर इस तय:

Camera.Parameters parameters = camera.getParameters(); 
parameters.setPreviewSize(yourSurfaceView.getWidth(), yourSurfaceView.getHeight()); 
camera.setParameters(parameters); 

यह किसी की मदद कर सकते हैं।

+11

कई मामलों में यह एक रनटाइम अपवाद फेंक देता है (सेट पैरामीटर विफल) क्योंकि सतह दृश्य का आकार किसी समर्थित पूर्वावलोकन आकार से मेल नहीं खाता है। – marino

+0

आपको getSupportedPreviewSize() द्वारा प्रदान किए गए पूर्वावलोकन आकार को सेट करना होगा, यह दस्तावेज़ों के अनुसार है। यह कहता है कि आपको setPreviewSize() पर कोई मनमाना मान निर्धारित नहीं करना चाहिए। –

4

आपको अपने पूर्वावलोकन आकार को (1) उपलब्ध पूर्वावलोकन आकार (2) के आधार पर बाध्य करना होगा। अगर आपको अभी भी इसकी आवश्यकता है तो मेरा समाधान यहां है:

private class CameraPreview extends SurfaceView implements SurfaceHolder.Callback { 
    private SurfaceHolder mHolder; 
    private Camera mCamera; 

    public CameraPreview(Context context, Camera camera) { 
     super(context); 
     mCamera = camera; 

     // Install a SurfaceHolder.Callback so we get notified when the 
     // underlying surface is created and destroyed. 
     mHolder = getHolder(); 
     mHolder.addCallback(this); 
     // deprecated setting, but required on Android versions prior to 3.0 
     mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    } 

    private void startPreview() { 
     try { 
     /** 
     * Orientation should be adjusted, see http://stackoverflow.com/questions/20064793/how-to-fix-camera-orientation/26979987#26979987 
     */ 

      Camera.Parameters parameters = mCamera.getParameters(); 
      List<Camera.Size> previewSizes = parameters.getSupportedPreviewSizes(); 
      Camera.Size previewSize = null; 
      float closestRatio = Float.MAX_VALUE; 

      int targetPreviewWidth = isLandscape() ? getWidth() : getHeight(); 
      int targetPreviewHeight = isLandscape() ? getHeight() : getWidth(); 
      float targetRatio = targetPreviewWidth/(float) targetPreviewHeight; 

      Log.v(TAG, "target size: " + targetPreviewWidth + "/" + targetPreviewHeight + " ratio:" + targetRatio); 
      for (Camera.Size candidateSize : previewSizes) { 
       float whRatio = candidateSize.width/(float) candidateSize.height; 
       if (previewSize == null || Math.abs(targetRatio - whRatio) < Math.abs(targetRatio - closestRatio)) { 
        closestRatio = whRatio; 
        previewSize = candidateSize; 
       } 
      } 

      Log.v(TAG, "preview size: " + previewSize.width + "/" + previewSize.height); 
      parameters.setPreviewSize(previewSize.width, previewSize.height); 
      mCamera.setParameters(parameters); 
      mCamera.setPreviewDisplay(mHolder); 
      mCamera.startPreview(); 
     } catch (IOException e) { 
      Log.d(TAG, "Error setting camera preview: " + e.getMessage()); 
     } 
    } 
} 
-1

समाधान सरल है! यदि आप एक्शनबार के तहत सतही दृश्य का उपयोग करते हैं तो शायद यह समस्या हो सकती है। मैं इस लाइन का उपयोग करता हूं और मैं ठीक कर सकता हूं, लेकिन मैं एक्शन बार का उपयोग करके परीक्षण नहीं करता हूं।

उपयोग करें:

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 
संबंधित मुद्दे