Android byte для изображения в Camera.onPreviewFrame
При попытке преобразования 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); }
- Как захватить изображение из пользовательского CameraView в Android?
- Android запускает программный снимок экрана
- Как изменить изображение от декартовых координат до полярных координат в Matlab?
- Android: объединение текста и изображения на Button или ImageButton
- Как создать эффект замедления прокрутки в прокрутке?
- Алгоритмы: совпадение эллипсов
- Формула для определения яркости цвета RGB
- Java: JPanel не масштабируется
- Повернуть изображение вокруг символа (JAVA)
- Фотосъемка с программным обеспечением на Android
- Вращение Java 2d в направлении мыши
- iPhone - Как вы можете покрасить изображение?
- Как перемещать изображение (анимацию)?
Это было трудно найти! Но поскольку API 8, в android.graphics есть class YuvImage. Это не потомок изображения, поэтому все, что вы можете с ним сделать, это сохранить его в Jpeg, но вы можете сохранить его в streamе памяти, а затем загрузить в Bitmap Image, если это то, что вам нужно.
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(); } }
Начиная с Android 3.0 вы можете использовать TextureView
и TextureSurface
для отображения камеры, а затем использовать mTextureView.getBitmap()
для получения дружественного кадра предварительного просмотра RGB.
Очень скелетный пример того, как это сделать, приведен в документах TextureView . Обратите внимание, что вам нужно будет настроить ваше приложение или активность на аппаратное ускорение, поставив android:hardwareAccelerated="true"
в манифесте.
Я нашел ответ после долгого времени. Вот…
Вместо использования BitmapFactory
я использовал свой собственный метод для декодирования данных этого byte[] data
до допустимого формата изображения. Чтобы декодировать изображение до допустимого формата изображения, нужно знать, какой формат изображения используется камерой, вызывая camera.getParameters().getPictureFormat()
. Это возвращает константу, определенную ImageFormat
. Узнав формат, используйте кодировщик для кодирования изображения.
В моем случае byte[] data
были в формате YUV
, поэтому я искал YUV
для преобразования BMP
и решил свою проблему.
вы можете попробовать следующее: в этом примере отправить кадры камеры на сервер
@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(); }