Я хотел бы использовать массив байтов изображения из ImageReader для создания объекта FirebaseVisionImageMetadata
для сканирования штрих-кода (как часть ML Kit ).Я использую Camera2 API и поддерживаю этот PR для поддержки предварительного просмотра кадров.
Size sz = chooseOptimalSize();
mCallbackImageDataReader =
ImageReader.newInstance(sz.getWidth(), sz.getHeight(), ImageFormat.YV12, 1);
mCallbackImageDataReader.setOnImageAvailableListener(reader -> {
byte[] data = getByteDataFromImageReader(reader);
if (data != null) {
//rotation compensation calculation not shown
mCallback.onPreviewFrame(data, reader.getImageFormat(), reader.getWidth(), reader.getHeight(), rotationCompensation);
}
}, null);
@Nullable
private byte[] getByteDataFromImageReader(@NonNull ImageReader reader) {
byte[] data = null;
try (Image image = reader.acquireNextImage()) {
Image.Plane[] planes = image.getPlanes();
if (planes.length > 0) {
ByteBuffer buffer = planes[0].getBuffer();
data = new byte[buffer.remaining()];
buffer.get(data);
}
}
return data;
}
Однако, когда я передаю полученный формат построителю FirebaseVisionImageMetadata
, я получаюследующая ошибка:
final FirebaseVisionImageMetadata meta = new FirebaseVisionImageMetadata.Builder()
.setFormat(format) //exception thrown here
.setWidth(width)
.setHeight(height)
.setRotation(rotation)
.build();
java.lang.IllegalArgumentException
at com.google.android.gms.common.internal.Preconditions.checkArgument(Unknown Source:5)
at com.google.firebase.ml.vision.common.FirebaseVisionImageMetadata$Builder.setFormat(Unknown Source:13)
Формат, который я передаю ImageReader
, ImageReader.YV12
, поскольку FirebaseVisionImageMetadata
принимает только NV21
или YV12
, но, поскольку ImageReader
не делаетЯ не могу принять NV21
, у меня осталось YV12
.Когда я использую этот формат (как показано выше), камера запускается с черным экраном.Я также попытался передать ImageReader.YUV_420_888
, но это приводит к тому же IllegalArgumentException
из FirebaseVisionImageMetadata
.
Я предполагаю, что мне, вероятно, придется преобразовать массив байтов по-другому или в другой формат(?).
Любая помощь будет оценена.
Источники:
- https://github.com/google/cameraview/pull/123/commits/f90580b1891c3edf91b4a254219d08b01110afce
- https://developer.android.com/reference/android/graphics/ImageFormat.html?hl=BG#YUV_420_888