Как создать растровое изображение из изображения в виде гранулированного байтового буфера?

Я пытаюсь получить изображение кадра для обработки, используя новое мобильное зрение apif.

Поэтому я создал Custom Detector, чтобы получить Frame и попытался вызвать метод getBitmap (), но он имеет значение null, поэтому я получил доступ к полутоновым данным кадра. Есть ли способ создать растровое изображение или аналогичный класс держателя изображений?

public class CustomFaceDetector extends Detector<Face> { private Detector<Face> mDelegate; public CustomFaceDetector(Detector<Face> delegate) { mDelegate = delegate; } public SparseArray<Face> detect(Frame frame) { ByteBuffer byteBuffer = frame.getGrayscaleImageData(); byte[] bytes = byteBuffer.array(); int w = frame.getMetadata().getWidth(); int h = frame.getMetadata().getHeight(); // Byte array to Bitmap here return mDelegate.detect(frame); } public boolean isOperational() { return mDelegate.isOperational(); } public boolean setFocus(int id) { return mDelegate.setFocus(id); }} 

Solutions Collecting From Web of "Как создать растровое изображение из изображения в виде гранулированного байтового буфера?"

Вы, наверное, уже разобрали это, но в случае, если кто-то наткнется на этот вопрос в будущем, вот как я его решил:

Как указывает @ pm0733464, формат изображения по умолчанию выходит из android.hardware.Camera – это NV21, и это тот, который используется CameraSource .

Этот ответ stackoverflow дает ответ:

 YuvImage yuvimage=new YuvImage(byteBuffer, ImageFormat.NV21, w, h, null); ByteArrayOutputStream baos = new ByteArrayOutputStream(); yuvimage.compressToJpeg(new Rect(0, 0, w, h), 100, baos); // Where 100 is the quality of the generated jpeg byte[] jpegArray = baos.toByteArray(); Bitmap bitmap = BitmapFactory.decodeByteArray(jpegArray, 0, jpegArray.length); 

Хотя frame.getGrayscaleImageData() предполагает, что bitmap будет полутоновой версией исходного изображения, это не так, по моему опыту. Фактически, SurfaceHolder идентичен тому, который поставляется в SurfaceHolder изначально.

Просто добавив несколько дополнительных функций, чтобы установить поле размером 300 пикселей на каждую сторону для области обнаружения. Кстати, если вы не установили высоту и ширину рамки в getGrayscaleImageData () из метаданных, вы получите странные поврежденные растровые изображения.

 public SparseArray<Barcode> detect(Frame frame) { // *** crop the frame here int boxx = 300; int width = frame.getMetadata().getWidth(); int height = frame.getMetadata().getHeight(); int ay = (width/2) + (boxx/2); int by = (width/2) - (boxx/2); int ax = (height/2) + (boxx/2); int bx = (height/2) - (boxx/2); YuvImage yuvimage=new YuvImage(frame.getGrayscaleImageData().array(), ImageFormat.NV21, frame.getMetadata().getWidth(), frame.getMetadata().getHeight(), null); ByteArrayOutputStream baos = new ByteArrayOutputStream(); yuvimage.compressToJpeg(new Rect(by, bx, ay, ax), 100, baos); // Where 100 is the quality of the generated jpeg byte[] jpegArray = baos.toByteArray(); Bitmap bitmap = BitmapFactory.decodeByteArray(jpegArray, 0, jpegArray.length); Frame outputFrame = new Frame.Builder().setBitmap(bitmap).build(); return mDelegate.detect(outputFrame); } public boolean isOperational() { return mDelegate.isOperational(); } public boolean setFocus(int id) { return mDelegate.setFocus(id); } }