Android-байт [] для изображения в Camera.onPreviewFrame - PullRequest
16 голосов
/ 06 марта 2011

При попытке преобразовать byte[] из Camera.onPreviewFrame в Bitamp с использованием BitmapFactory.decodeByteArray выдает ошибку SkImageDecoder::Factory returned null

Ниже приведен мой код:

public void onPreviewFrame(byte[] data, Camera camera) {
    Bitmap bmp=BitmapFactory.decodeByteArray(data, 0, data.length);
}

Ответы [ 4 ]

32 голосов
/ 02 июня 2011

Это было трудно найти! Но, начиная с API 8, в android.graphics есть класс YuvImage. Это не потомок Image, поэтому все, что вы можете с ним сделать, это сохранить его в формате Jpeg, но вы можете сохранить его в потоке памяти и затем загрузить в растровое изображение, если это то, что вам нужно.

import android.graphics.YuvImage;

@Override
public void onPreviewFrame(byte[] data, Camera camera) {
    try {
        Camera.Parameters parameters = camera.getParameters();
        Size size = parameters.getPreviewSize();
        YuvImage image = new YuvImage(data, parameters.getPreviewFormat(),
                size.width, size.height, null);
        File file = new File(Environment.getExternalStorageDirectory()
                .getPath() + "/out.jpg");
        FileOutputStream filecon = new FileOutputStream(file);
        image.compressToJpeg(
                new Rect(0, 0, image.getWidth(), image.getHeight()), 90,
                filecon);
    } catch (FileNotFoundException e) {
        Toast toast = Toast
                .makeText(getBaseContext(), e.getMessage(), 1000);
        toast.show();
    }
}
7 голосов
/ 12 сентября 2012

Начиная с Android 3.0, вы можете использовать TextureView и TextureSurface для отображения камеры, а затем использовать mTextureView.getBitmap() для получения удобной рамки предварительного просмотра RGB.

Очень скелетный пример того, как это сделатьэто указано в документах TextureView .Обратите внимание, что вам нужно настроить аппаратное ускорение приложения или действия, указав android:hardwareAccelerated="true" в манифесте.

4 голосов
/ 18 марта 2011

Я нашел ответ через долгое время.Вот оно ...

Вместо использования BitmapFactory я использовал свой собственный метод для декодирования этого byte[] data в правильный формат изображения.Чтобы декодировать изображение в допустимый формат изображения, необходимо знать, какой формат изображения используется камерой, вызвав camera.getParameters().getPictureFormat().Это возвращает константу, определенную как ImageFormat.Зная формат, используйте соответствующий кодер для кодирования изображения.

В моем случае byte[] data был в формате YUV, поэтому я искал преобразование YUV в BMP, и эторешил мою проблему.

2 голосов
/ 15 октября 2015

вы можете попробовать это: В этом примере отправляются кадры камеры на сервер

 @Override
        public void onPreviewFrame(byte[] data, Camera camera) {
        try {
            byte[] baos = convertYuvToJpeg(data, camera);
            StringBuilder dataBuilder = new StringBuilder();
            dataBuilder.append("data:image/jpeg;base64,").append(Base64.encodeToString(baos, Base64.DEFAULT));
            mSocket.emit("newFrame", dataBuilder.toString());
        } catch (Exception e) {
           Log.d("########", "ERROR");
        }
    }

};


public byte[] convertYuvToJpeg(byte[] data, Camera camera) {

    YuvImage image = new YuvImage(data, ImageFormat.NV21,
            camera.getParameters().getPreviewSize().width, camera.getParameters().getPreviewSize().height, null);

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    int quality = 20; //set quality
    image.compressToJpeg(new Rect(0, 0, camera.getParameters().getPreviewSize().width, camera.getParameters().getPreviewSize().height), quality, baos);//this line decreases the image quality


    return baos.toByteArray();
}
...