2012-10-20 16 views
6

मैं बाइट-सरणी प्राप्त करने की कोशिश कर रहा हूं और वहां से चित्रों की कुछ पंक्तियों को onPreviewFrame() पर कॉपी कर रहा हूं। तो मैं कैमरा और नए बाइट सरणी तैयारऑनप्रूवफ्रेम गलत बाइट लौट रहा है [] लंबाई

 try { 
     if (cam != null) { 

      Camera.Parameters parameters = cam.getParameters(); 
      parameters.setPreviewFrameRate(25); 
      parameters.setPictureFormat(ImageFormat.JPEG); 
      cam.setParameters(parameters); 
      cam.setPreviewDisplay(holder); 
      cam.startPreview(); 

      arr = new byte[(parameters.getPreviewSize().height) 
        * (parameters.getPreviewSize().width)]; 

      Log.i("" + parameters.getPictureSize().height, " " 
        + parameters.getPictureSize().width); 


     } 
    } catch (IOException e) { 
     Log.d("CAMERA", e.getMessage()); 
    } 

और लॉग मुझे बताने:

480 640

तो arr.length = 307200

लेकिन: (

public void onPreviewFrame(byte[] data, Camera camera) {  
    Log.i(arr.length+" ",data.length+""); 
} 

arr.length = 307200 जिनमें से कोर्स एम eans फ्रेम आकार = 640 * 480)

लेकिन data.length = 460800 (और यह फ्रेम आकार = 800 * 576)

और System.arraycopy(data, 0, arr, 0, arr.length); साथ आगमन के लिए जब मैं नकल करने की कोशिश डाटा और फिर इसका मतलब निर्यात चित्र:

FileOutputStream outStream = null; 
    try { 
     outStream = new FileOutputStream("/sdcard/new.jpg"); 

     Camera.Parameters parameters = cam.getParameters(); 
     Size size = parameters.getPreviewSize(); 

     YuvImage image = new YuvImage(arr, parameters.getPreviewFormat(), 
       size.width, size.height, null); 
     image.compressToJpeg(
       new Rect(0, 0, image.getWidth(), image.getHeight()), 90, 
       outStream); 

     outStream.flush(); 
     outStream.close(); 
    } catch (FileNotFoundException e) { 
     Log.d("CAMERA", e.getMessage()); 
    } catch (IOException e) { 
     Log.d("CAMERA", e.getMessage()); 
    } 

चित्र हरे हो जाते हैं:

enter image description here

तो डेटा-सरणी 640 * 480 बनने के लिए मुझे क्या करना है? या हो सकता है कि आप एकल पंक्ति प्राप्त करने के लिए एक और तरीका जानें (उदाहरण के लिए) बिटमैप और इसे किसी अन्य बिटमैप में जोड़ें?

उत्तर

4

सही सरणी आकार new byte[previewSize.height * previewSize.width * (ImageFormat.getBitsPerPixel(parameters.getPreviewFormat()))/8]; (, उन्हें ImageFormat.getBitsPerPixel साथ मिल विभिन्न स्वरूपों विभिन्न बिट्स प्रति पिक्सेल मान)

+0

मिल गया है! धन्यवाद! – Vitaliy

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