преобразование байтового потока в RGB с использованием libjpeg - PullRequest
4 голосов
/ 07 мая 2009

Я перехватываю пакет и извлекаю полезную нагрузку. Эта полезная нагрузка представляет собой сжатые данные байтового потока в формате jpeg (например, эти данные присваиваются unsigned char *payload). Я знаю, что если у меня есть указатель FILE, то я могу использовать библиотеку libjpeg для извлечения информации об изображении. Мой вопрос, есть ли способ передать мой указатель (*payload) в функции libjpeg, чтобы получить значения RGB и размерность изображения?

Спасибо.

Ответы [ 4 ]

3 голосов
/ 07 мая 2009

Чтобы добавить к ответу Тала , вам нужно взглянуть на реализацию функции jpeg_stdio_src() в jdatasrc.c. Цель этой функции - инициализировать объект источника данных, а именно cinfo->src. Итак, что вы должны сделать, это следующее:

  1. Создайте структуру (похожую на структуру my_source_mgr в jdatasrc.c), которая имеет в качестве первого члена экземпляр struct jpeg_source_mgr. Добавьте других участников, которые вы считаете необходимыми. Обратите внимание, что по сути мы выполняем ручное наследование - в C ++ мы определяем класс, производный от jpeg_source_mgr, и различные указатели функций, объявленные в jpeg_source_mgr, вместо этого будут виртуальными функциями. Но мы используем C, поэтому нам приходится трудным образом наследовать и полиморфизировать.
  2. Выделите место для экземпляра вашей структуры, убедившись, что выделено правильное количество байтов, и заполните свои элементы данных.
  3. Реализация следующих пяти функций:

    • void init_source(j_decompress_ptr)
    • boolean fill_input_buffer(j_decompress_ptr)
    • void skip_input_data(j_decompress_ptr, long)
    • boolean resync_to_start(j_decompress_ptr, int)
    • void term_source(j_decompress_ptr)

    Обратите внимание, что для буфера в памяти эти функции, вероятно, будут очень тривиальными.

  4. Наконец, инициализируйте указатели на функции в вашем jpeg_source_mgr члене, чтобы они указывали на эти функции.

Имея это, вы можете использовать это вместо jpeg_stdio_src() для инициализации менеджера источника данных, и тогда вам будет хорошо, если вы будете декодировать файл из файловой системы.

3 голосов
/ 01 сентября 2011

Re: Ответ Адама Розенфилда, вам не нужно ничего реализовывать самостоятельно: jpeg_mem_src() будет делать то, что вы хотите:

jpeg_mem_src(&cinfo, payload, payload_len);

Вы должны сохранить все изображение в памяти (и знать его длину).

obStackoverflow: я знаю, ответ на действительно старый вопрос, но сегодня я должен сделать именно это, и эта страница заняла первое или второе место в ответ на мой поиск в Интернете.

0 голосов
/ 11 сентября 2012

В последних сборках libjpeg jpeg_mem_src уже реализован для вас.

Очень легко скомпилировать libjpeg для Windows.

Загрузите источник с веб-страницы проекта
Распакуйте все в одну папку
Затем откройте командную строку Visual Studio 10 для этого каталога

Тип

nmake /f makefile.vc setup-v10

Это создаст файл .sln, который откроется в VS2010. Это должно скомпилировать оттуда.

После этого вы также можете отлаживать исходные тексты libjpeg.

0 голосов
/ 07 мая 2009

libjpeg имеет менеджеры ввода / вывода, которые могут быть расширены для использования необработанных буферов памяти или любой другой формы ввода / вывода, которую вы имеете, но AFAIK only FILE * фактически реализован в выпуске библиотеки.

...