2012-10-20 18 views
6

Bayt dizisini almayı ve onPreviewFrame() numaralı resim önizlemesini görüntüleyen bir dizi başka bir diziye kopyalamayı deniyorum. Bu yüzden Kamera ve yeni bayt dizisini hazırlamakonPreviewFrame yanlış byte döndürülüyor [] uzunluk

 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()); 
    } 

Ve Log benim anlatmak:

480 640

Yani arr.length = 307200

Ama:

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

arr.length = 307200 (hangi kurs m eans Çerçeve Boyutu = 640 * 480)

ama data.length = 460800 (ve ben kopyalamak çalıştığınızda Çerçeve Boyutu = 800 * 576)

ve Veri sonra System.arraycopy(data, 0, arr, 0, arr.length); ile ARR ve ihracat resmini anlamı:

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()); 
    } 

Resim yeşil hale gelir:

enter image description here

Veri dizisini 640 * 480 yapmak için ne yapmam gerekiyor? Ya da belki de tek bir satırdan (örneğin) Bitmap'ten başka bir bitmap eklemek için başka bir yol biliyor musunuz?

cevap

4

doğru dizi boyutunda new byte[previewSize.height * previewSize.width * (ImageFormat.getBitsPerPixel(parameters.getPreviewFormat()))/8]; (farklı biçimleri farklı bit başına piksel değerlerine sahip, ImageFormat.getBitsPerPixel ile onları almak)

+0

Anladım olduğunu! Teşekkürler! – Vitaliy