2013-05-24 8 views
28

पर फिट करने के लिए छवि को स्कूड किया गया है, मैंने पूर्ण स्क्रीन में कैमरा पूर्वावलोकन प्रदर्शित करने के लिए एक छोटा सा एप्लीकेशन विकसित किया है। मैं इसके लिए कैमरा एपीआई का उपयोग कर रहा हूँ।पूर्ण स्क्रीन में कैमरा डिस्प्ले/पूर्वावलोकन पहलू अनुपात को बनाए नहीं रखता है - स्क्रीन

इस गतिविधि लेआउट है:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:orientation="vertical" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent"> 

    <!-- This is the container for the camera preview screen --> 
    <FrameLayout android:id="@+id/camera_preview" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content"/> 
</LinearLayout> 

जब डिवाइस चित्र में है, प्रदर्शन खड़ी आदेश डिवाइस स्क्रीन की ऊंचाई मैच के लिए में माप लिया जाता है - तो पहलू अनुपात से एक के समान नहीं है मूल कैमरा

enter image description hereenter image description here

पहली छवि देशी कैमरा डिवाइस के साथ किया जाता है: इन 2 छवियों जो बेहतर बताते हैं कि मैं क्या कह रहा हूँ है। दूसरी छवि मेरे ऐप के साथ बनाई गई है, कैमरे के साथ पूर्ण स्क्रीन में - स्क्रीन को फिट करने के लिए छवि को खींचा गया है।

मुझे getSupportedPreviewSizes() मेहोड और विरूपण के बिना दिए गए पूर्वावलोकन आकार के बावजूद कैमरा पूर्वावलोकन को पूर्ण स्क्रीन होने की आवश्यकता है। क्या इसे पूरा करने का कोई तरीका है? कैमरा पूर्वावलोकन पूर्ण स्क्रीन में होने पर उचित पहलू अनुपात को बनाए रखने का कोई तरीका है? मुझे उम्मीद है कि यह ओएस द्वारा स्वचालित रूप से किया जाएगा - पक्ष अनुपात को बनाए रखने के दौरान अनुरोधित संकल्प से मेल खाने के लिए छवि को क्रॉप करना, लेकिन ऐसा नहीं होता है।

मैंने प्रदर्शन से SurfaceView बड़ा प्रदर्शन करने की कोशिश की है (इस प्रश्न के बाद: Fitting a camera preview to a SurfaceView larger than the display), लेकिन मेरे मामले में ठीक नहीं है क्योंकि मैं स्नैपशॉट्स (6 फ्रेम/सेकेंड) कैप्चर कर रहा हूं और वे उपयोगकर्ता नहीं देख रहे हैं स्क्रीन पर (फ्रेम में सभी कैमरा पूर्वावलोकन होते हैं, भले ही यह स्क्रीन पर दिखाई न दे)।

मैंने यहां पोस्ट किया: https://www.dropbox.com/s/3d52xt8kazynsae/CameraFullScreen.7z?v=0mcn मैंने जो पूरी परियोजना बनाई है।

कोई विचार/समाधान मेरे लिए महत्वपूर्ण से अधिक है। बहुत बहुत धन्यवाद।

============================================== ==========================

ss1271 जवाब के कारण अपडेट:

मैं एक छोटे से विश्लेषण करेंगे प्रस्तावों आपने ऊपर सैमसंग गैलेक्सी ऐस II के लिए लिखा है।

मैं स्क्रीन संकल्प: 480x800 - पहलू अनुपात 3: 5 = 0,6

द्वितीय। getSupportedPreviewSizes - मुझे पूरा यकीन है कि ये मान पीछे कैमरे से हैं। इन स्क्रीन रिज़ॉल्यूशन रूप में एक ही पहलू अनुपात होने और इन मूल्यों का उपयोग कर नहीं -

2560x1920 - 0,75 

    2560x1536 - 0,60 

    2048x1536 - 0,75 

    2048x1232 - 0,60 

    960x720  - 0,75 

    640x480  - 0,75 

तो, अपने विधि एक Size2560x1536 या 2048x1232 करने के लिए इसी वापस आ जाएगी: नीचे इन प्रस्तावों के लिए पहलुओं अनुपात हैं तस्वीर विकृत करें। मेरे लिए समस्या यह है कि मैं 6 बड़े फ्रेम/सेकेंड पर कब्जा करने के बाद से बड़े संकल्पों का उपयोग नहीं कर सकता और इन्हें कम रिज़ॉल्यूशन पर सहेजने की आवश्यकता है।

मैं एक सैमसंग एस 2 डिवाइस से कुछ परिणाम नीचे पेश करेंगे:

मैं स्क्रीन संकल्प: 480 x 800 - पहलू अनुपात 3: 5 = 0,6

द्वितीय। बैक कैमरा
ए)। getSupportedPreviewSizes:

800/480 - 480/800 = 0,60 
800/450 - 450/800 = 0,56 
720/480 - 0,66 
640/480 - 0,75 
352/288 - 0,81 
320/240 - 0,75 
176/144 - 0,81 

ख)। मूल निवासी के कैमरा रिज़ॉल्यूशन:

3264/2448 - 0,75 - not full screen 
3264/1968 - 0,60 - FULL SCREEN (since has the same aspect ratio as device screen) 
2048/1536 - 0,75 - not full screen 
2048/1232 - 0,60 - FULL SCREEN (same aspect ratio as device screen) 
800/480 - 0,60 - FULL SCREEN (same aspect ratio as device screen) 
640/480 - 0, 75 - not full screen 

तृतीय। फ्रंट कैमरा
ए)। getSupportedPreviewSizes:

640/480 - 0,75 
352/288 - 0,81 
320/240 - 0,75 
176/144 - 0,81 

बी)। मूल कैमरा पूर्ण स्क्रीन में नहीं है और मैं एक संकल्प का चयन नहीं कर सकता - विकल्प अक्षम है।

एस 2, बैक कैमरा के लिए, मुझे आश्चर्य है कि क्यों getSupportedPreviewSizes() विधि मूल कैमरा के रूप में या मूल कैमरे द्वारा प्रदर्शित किए गए मूल संकल्प के समान संकल्प वापस नहीं करते हैं? मुझे आश्चर्य है कि मेरे पास getSupportedPreviewSizes() विधि द्वारा 3264/1 9 68, 2048/1232 जैसे विकल्प क्यों नहीं हैं? : enter image description here

+0

जो मैं चाहता हूं वह वास्तव में कैमरा पहलू को उचित पहलू अनुपात – Paul

+0

बनाए रखने के लिए फसल डाला जा सकता है, क्या मैं पूछ सकता हूं: क्या आपको एक अनुकूलित कैमरा की आवश्यकता है या आप कैमरा दृश्यदर्शी (पूर्वावलोकन) दिखाना चाहते हैं? – dumbfingers

+0

मेरे पास ओवरले बटन के साथ एक अनुकूलित कैमरा है। – Paul

उत्तर

23

संक्षेप में, आप फिर भी तुम अपने आप को द्वारा समर्थित पूर्वावलोकन आकार के बीच उपयुक्त आकार पता लगाने के लिए, एक स्वनिर्धारित कैमरा पूर्वावलोकन तुम क्या चाहते है केवल यदि आवश्यकता होगी पूर्ण स्क्रीन में एक कैमरा पूर्वावलोकन कर सकते हैं ।

अपने प्रश्न के लिए, Android Developers -- Camera

के अनुसार आप अपने कैमरे पूर्वावलोकन, जैसा कि ऊपर टिप्पणी में उल्लेख किया surfaceChanged() विधि में इस सेट के लिए एक विशिष्ट आकार सेट करना चाहते हैं। जब सेटिंग पूर्वावलोकन आकार, तो आप getSupportedPreviewSizes() से मानों का उपयोग करें। setPreviewSize()विधि में मनमाने ढंग से मान सेट न करें।

ऐसा लगता है कि आप getSupportedPreviewSizes() द्वारा प्रदान किए गए आकार के अलावा मैन्युअल रूप से इच्छित आकार को पार नहीं कर सकते हैं। अपने फोन कैमरे द्वारा समर्थित आकारों की नज़दीकी जांच के साथ, आपको लगता है कि समर्थित आकारों का अनुपात आपकी स्क्रीन के अनुपात के समान नहीं हो सकता है।

उदाहरण के लिए, सैमसंग गैलेक्सी ऐस द्वितीय, 480x800 संकल्प स्क्रीन है SizegetSupportedPreviewSizes() से लौटे पढ़कर, अपने कैमरे का समर्थन करता है:

2560x1920

2560x1536

2048x1536

2048x1232

960x720

640x480

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

उचित पूर्वावलोकन आकार खोजने का कार्यान्वयन जटिल सामान नहीं है। ऐसा करने के लिए एक आम तरीका कुछ इस तरह होगा:

/** 
    * Calculate the optimal size of camera preview 
    * @param sizes 
    * @param w 
    * @param h 
    * @return 
    */ 
    private Size getOptimalSize(List<Size> sizes, int w, int h) { 

     final double ASPECT_TOLERANCE = 0.2;   
     double targetRatio = (double) w/h;   
     if (sizes == null)    
      return null;   
     Size optimalSize = null;   
     double minDiff = Double.MAX_VALUE;   
     int targetHeight = h;   
     // Try to find an size match aspect ratio and size   
     for (Size size : sizes) 
     {    
//   Log.d("CameraActivity", "Checking size " + size.width + "w " + size.height + "h");    
      double ratio = (double) size.width/size.height;    
      if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE)     
       continue;    
      if (Math.abs(size.height - targetHeight) < minDiff) 
      {     
       optimalSize = size;     
       minDiff = Math.abs(size.height - targetHeight);    
      }   
     }   
     // Cannot find the one match the aspect ratio, ignore the requirement  

     if (optimalSize == null) 
     { 
      minDiff = Double.MAX_VALUE;    
      for (Size size : sizes) { 
       if (Math.abs(size.height - targetHeight) < minDiff) 
       { 
        optimalSize = size; 
        minDiff = Math.abs(size.height - targetHeight); 
       } 
      } 
     } 

     SharedPreferences previewSizePref; 
     if (cameraId == Camera.CameraInfo.CAMERA_FACING_BACK) { 
      previewSizePref = getSharedPreferences("PREVIEW_PREF",MODE_PRIVATE); 
     } else { 
      previewSizePref = getSharedPreferences("FRONT_PREVIEW_PREF",MODE_PRIVATE); 
     } 

     SharedPreferences.Editor prefEditor = previewSizePref.edit(); 
     prefEditor.putInt("width", optimalSize.width); 
     prefEditor.putInt("height", optimalSize.height); 

     prefEditor.commit(); 

//  Log.d("CameraActivity", "Using size: " + optimalSize.width + "w " + optimalSize.height + "h");    
     return optimalSize;  
    } 

और तुम भी उपयुक्त कैमरा आकार (उत्पादन चित्र आकार) पता लगाने के लिए इसी तरह के कर सकते हैं।

नोट: मुझे इंटरनेट से उपरोक्त कोड का मूल संस्करण मिला और मैंने अपने उद्देश्य के लिए कुछ संशोधन/अनुकूलन किया।

अगर यह आपके लिए काम करता है तो कृपया मुझे बताएं।

+0

सबसे पहले, आपके उत्तर के लिए बहुत बहुत धन्यवाद। बेहतर दृश्यता के लिए आपके उत्तर का जवाब देने के लिए मैंने प्रश्न को अद्यतन किया है। मेरा एप्लिकेशन बैक कैमरे की तुलना में अधिक फ्रंट कैमरा का उपयोग कर रहा है। ऐसा लगता है कि, यदि मूल कैमरा पहलू अनुपात के मुद्दे के कारण पूर्णस्क्रीन (कम से कम एस 2 और एस 3 फोन पर नहीं) में फ्रंट कैमरा प्रदर्शित नहीं करता है, तो मैं वही नहीं कर पाऊंगा छवि विकृत किए बिना ... – Paul

+0

बहुत बहुत धन्यवाद! SetPreviewSize() का उपयोग नहीं करने के लिए मेरे लिए समस्या तय की गई है। – BVB

+2

कोई भी इस धागे को ढूंढ रहा है, मुझे सलाह है कि आप यहां भी देखें: http://stackoverflow.com/questions/17348614/make-a-surfaceview-larger-than-the-screen-fitting-a-camera-preview-to-a -सुरफेस – Sam

0

मुझे कैमरा 2 एपीआई में एक ही समस्या का सामना करना पड़ रहा था, मैंने इस समस्या को हल करने के लिए Preview size and devices aspect ratio का उपयोग किया है। आप अपने कैमरा एपीआई के साथ भी ऐसा ही कर सकते हैं।

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