Я пытаюсь получить 16-битное цветное изображение, разрешение 80 х 60 от встроенной камеры (datasheet here). Я успешно могу получить 9600 (80 * 60 * 16/8) байтов с камеры, но у меня проблема с отображением изображения. Я использую следующий код для преобразования массива байтов в Bitmap:Android-изображение с 16-битным цветом в растровое изображение
bm = Bitmap.createBitmap(80, 60, Bitmap.Config.RGB_565);
bm.copyPixelsFromBuffer(ByteBuffer.wrap(jpegBytes));
jpegBytes является массив байтов на изображение и оно имеет длину 9600 байт.
Прямо сейчас, я получаю изображения, которые выглядят так:
99% времени. Тем не менее, я могу получить неповрежденного изображения, которые выглядят следующим образом:
очень редко. Есть ли у кого-нибудь какие-либо предложения относительно того, почему это происходит? Спасибо!
UPDATE:
Похоже, все пиксели находятся в правильном месте, но иметь их значения RGB смешиваются. Например, белая часть между обеими фотографиями одинакова, потому что порядок RGB не имеет значения, чтобы получить белый цвет. Тем не менее, очевидно, что цвета смешиваются, потому что красный стул отображается как синие в поврежденном изображении и синий рюкзак отображается как зеленый в поврежденных изображениях
Похоже, что структура изображения является правильным, но цвета выключены. Вы уверены, что изображение всегда должно быть форматом RGB_565? Кроме того, вы уверены, что данные изображения являются необработанными пикселями (а не, скажем, кодировкой jpeg)? –
Согласно техническому описанию камеры, изображение должно быть передано в формате RGB_565. Мне удалось получить 4-битные и 8-битные изображения в оттенках серого с камеры и отобразить их с помощью ARGB_8888, но приложение вылетает, когда я использую ARGB_8888 для отображения 16-битного изображения. Это связано с тем, что в 16-битном изображении есть 2 байта на пиксель, а не 4 байта на пиксель, что требуется ARGB_8888. –
Возможно, это проблема с порядком байтов. Что произойдет, если вы используете 'bm.copyPixelsFromBuffer (ByteBuffer.wrap (jpegBytes) .order (ByteOrder.LITTLE_ENDIAN));'? –