JPEG байтов в шестнадцатеричное значение

Я получаю поток через uvc, который дает мне каждый поток mjpeg.

При записи фрейма jpeg в растровое изображение массив байтов, просматриваемый отладчиком, выглядит следующим образом:

{ 0, -128, 1, -128, 0, -128, .......}

Я создаю файл, выполнив это:

bitmap.copyPixelsFromBuffer(frame);
File file = new File(Constants.CAPTURE_PATH, System.currentTimeMillis() + ".jpeg");
file.createNewFile();
out = new FileOutputStream(file);

bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);

После того, как я создаю файл и просматриваю его с помощью шестнадцатеричной программы просмотра, файл выглядит следующим образом:

FF D8 FF E0 00.....

Означает ли это, что {0} стал FF, а {-128} стал D8?

Какие правила сделали это возможным? Любая помощь будет очень благодарна.

2 ответа

Решение

Возможно, вы просматриваете заголовок файла JPEG, если это самые первые байты в файле, как видно из шестнадцатеричной программы просмотра файла. FF D8 FF выглядят поразительно похожими. Смотрите здесь, например, и страницу википедии здесь.

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

После нашего краткого разговора в комментариях, я чувствую, что это информация, которую вы ищете.

На самом деле вы смотрите на заголовок файла. Заголовок - это, по сути, блок кода в начале файла, который сообщает компьютеру, что это такое, поэтому он знает, что с ним делать.

Дополнительная информация о заголовках файлов: https://www.webopedia.com/TERM/H/header.html

Теперь к вашей конкретной проблеме. С jpegs (как и любой другой файл) у них есть свои собственные заголовки и способ организации данных. Заголовок JPEG начинается с FF D8 что для читателя файла JPEG означает SOI (начало изображения). Затем идет FF E0 что означает APP0 (сегмент приложения). И список продолжается.

Подробнее о файлах JPEG: https://web.archive.org/web/20120403212223/http://class.ee.iastate.edu/ee528/Reading%20material/JPEG_File_Format.pdf

Что вам нужно сделать, это прыгнуть за заголовок и начать искать ваши "фактические" данные. Несколько хитрая часть заголовков jpeg-файлов заключается в том, что они не имеют одинаковый размер, поэтому вам придется искать маркер SOS (начало сканирования), если я не ошибаюсь, и идти оттуда.

Другие вопросы по тегам