6 Stimmen

onPreviewFrame mit Rückgabe eines falschen byte[] length

Ich habe versucht, Byte-Array zu erhalten und kopieren Sie von dort zu einem anderen Array einige Zeilen der Bildvorschau whith onPreviewFrame() . Ich bereite also die Kamera und ein neues Byte-Array vor

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

Und Log sagt mir:

480 640

Also arr.length = 307200

Aber:

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

arr.length = 307200 (das bedeutet natürlich Frame Size = 640*480)

b data.length = 460800 (und das bedeutet Frame Size = 800*576)

Und wenn ich versuche, Daten nach Arr zu kopieren mit System.arraycopy(data, 0, arr, 0, arr.length); und dann Bild exportieren:

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

Das Bild wird grün:

enter image description here

Was muss ich also tun, um data-array zu 640*480 zu machen? Oder vielleicht wissen Sie einen anderen Weg, um einzelne Zeilen aus (zum Beispiel) Bitmap zu erhalten und fügen Sie es zu einem anderen Bitmap?

5voto

molnarm Punkte 9715

Die richtige Array-Größe ist new byte[previewSize.height * previewSize.width * (ImageFormat.getBitsPerPixel(parameters.getPreviewFormat())) / 8]; (verschiedene Formate haben unterschiedliche Bit-pro-Pixel-Werte, die Sie mit ImageFormat.getBitsPerPixel )

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X