Я пытаюсь получить массив байтов в градациях серого из сценария использования CameraX ImageCapture в Android java. До сих пор я пытался преобразовать массив байтов, полученный в onCaptureSuccess, но безуспешно. Удивительно, но не так много документации об этом процессе. Формат, возвращаемый Image.getFormat()
- JPEG
. Android Документация только пишет, что это единственная плоскость, "Сжатые данные, поэтому шаги строк и пикселей равны 0. Чтобы распаковать, используйте BitmapFactory # decodeByteArray". При поиске JPEG можно преобразовать в оттенки серого, извлекая компонент Y, как предполагает в этом сообщении . Но ничего на , как на самом деле извлечь этот компонент. Я пытался создать новый массив байтов, используя один элемент из трех, но безуспешно. В конечном итоге я закончил преобразование байтового массива в битовый массив:
Bitmap originalBitmap = BitmapFactory.decodeByteArray(originalByteArray, 0, originalByteArray.length);
Bitmap grayScaleBitmap = Bitmap.createBitmap(originalBitmap.getWidth(), originalBitmap.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(grayScaleBitmap);
Paint paint = new Paint();
ColorMatrix colorMatrix = new ColorMatrix();
colorMatrix.setSaturation(0);
ColorMatrixColorFilter colorMatrixColorFilter = new ColorMatrixColorFilter(colorMatrix);
paint.setColorFilter(colorMatrixColorFilter);
canvas.drawBitmap(originalBitmap, 0, 0, paint);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
grayScaleBitmap.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream);
byte[] grayScaleArray = byteArrayOutputStream.toByteArray();
, который работает, но требует ненужных вычислений. Какие операции требуются для непосредственного преобразования исходного байтового массива в оттенки серого? Как упоминалось ранее, это единственный плоский байтовый массив, который выглядит следующим образом:
[-1, -40, -1, -31, -91, 95, 69, 120, 105, 102, 0, 0, 77, 77, 0, 42, 0, ...]
Любая помощь в понимании того, как это работает, будет приветствоваться.