Выводим JPEG на TFT-экран ILI9341

Перебрал несколько библиотек и остановился на picojpeg. С некоторыми доработками ее и будем использовать. Так же используется самописная библиотека для TFT на ILI9341. Может кому пригодятся мои изыскания.



При помощи утилиты bin2c преобразуем картинку в массив, не будем подключать SD карту:
bin2c.exe -o cat.h cat.jpg 


Получаем примерно такое:
const long int cat_jpg_size = 15235;
const unsigned char cat_jpg[15235] = {
    0xFF, 0xD8, 0xFF, 0xE0, 0x00, 0x10, 0x4A, 0x46, 0x49, 0x46, 0x00, 0x01, 0x01, 0x01, 0x00, 0x64,
    0x00, 0x64, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x3B, 0x43, 0x52, 0x45, 0x41, 0x54, 0x4F, 0x52, 0x3A,
...


Есть два варианта использования — декодировать в буфер и затем выводить его содержимое на экран или выводить картинку на экран по мере декодирования. Первый вариант требует много памяти: ширина * высота * 3.

Вариант 1:
memset(&jpeg_buffer, 0, sizeof(jpeg_buffer_t));
jpeg_buffer.buffer = bw_jpg;
jpeg_buffer.length = bw_jpg_size;

status = pjpeg_decode_init(&image_info, pjpeg_need_bytes_callback, &jpeg_buffer);
if (!status) {
	pImage = jpeg_decode_buffer(image_info);
	if (pImage) {
		drawRGBBitmap(pImage, 0, 0, image_info.m_width, image_info.m_height, image_info.m_comps);
		free(pImage);
	}
}


Вариант 2:
memset(&jpeg_buffer, 0, sizeof(jpeg_buffer_t));
jpeg_buffer.buffer = cat_jpg;
jpeg_buffer.length = cat_jpg_size;

status = pjpeg_decode_init(&image_info, pjpeg_need_bytes_callback, &jpeg_buffer);
if (!status) {
	jpeg_show(image_info, 0, 0);
}


Основная загвоздка была в том что файл разжимается в 24-биный RGB, а экран понимает модель 5:6:5. Не спрашивайте меня что это такое. )) Но преобразуется одно в другое одной строкой:
((R & 0xF8) << 8) | ((G & 0xFC) << 3) | (B >> 3)


Тестовый проект для CoIDE в прикрепленном файле.

p.s. для альтернативно одаренных. Проект для STM32 (на что как бы намекают тэги) и для среды CoIDE (о чем написано строкой выше). Подробнее узнать об используемом TFT и его подключении поможет нажатие на соответствующий тэг.
  • +1
  • 11 января 2014, 23:50
  • aliaksei
  • 1
Файлы в топике: jpeg-test.zip

Комментарии (17)

RSS свернуть / развернуть
А что так мало-то? Я только приготовился почитать о picojpeg подробнее, как статья кончилась на ноте «а дальше курите код».
-1
  • avatar
  • Vga
  • 12 января 2014, 00:45
Да вроде нечего писать. В сам picojpeg я не вникал — декодирует и ладно.
0
Да хотя бы подробней описать, как с ним работать. Вон, посмотри, например, на статьи про MP3 от MikeSmith . В декодер helix он тоже не вникает (по крайней мере в статье), но там есть, что почитать!
-1
Так а что писать? Я наоборот старался сделать функции по принципу передал указатель на буфер, координаты где рисовать и забыл.
0
Скажем так, твоя статья — по сути предисловие к коду. А его я не читал, да и, в общем, не собираюсь. А хотелось бы, чтобы статья была сама по себе, а код к ней только иллюстрацией.
-1
Мож потом придумаю и допишу, пока голова пухнет от этоих джипегов ))
0
Как обычно, имеется 2 новости — хорошая и плохая.
Итак, начнем хорошей:
Действительно полезная статья. Я наконец-то нашел что давно искал — программу для конвертации изображений в массив кодов. А то была уже шальная мысль самому писать нечто подобное ;)

Ну и плохом:
Исходя из названия я (наверное как и многие) ожидал увидеть здесь особенности работы с экраном ILI9341…
0
Например, какие особенности?
0
Осталось за кодром:
к чему подключался дисплей?
как подключался? Какие выводы использовались, назначение, особенности подключения…
для чего написана библиотека? какая студия или тулчеин её собирает? как подключить её к своему коду, как собрать?
что за контроллер используется? Или дисплей сам содержит контроллер, который можно запрограммить?
Ну, думаю, для краткой статьи будет достаточно…
0
… за кАдром…
0
Гыы. В теге есть про STM32… Каким боком он относится к статье?
0
Может вобще начать с устройства транзистора? Есть тэги, есть поиск по сайту. Я полагаю читатели умеют ими пользоваться.
0
Читатели умеют пользоваться всем. Тогда какой смысл во всем этом?
0
Что сказать-то хотел? ))
0
Вот и из этой статьи непонятно, что же все-таки хотел сказать автор…
Непонятная статья порождает кучу непонятных комментариев…
0
Я думаю автор хотел сказать, что есть такая библиотека picojpeg, и она вполне работоспособна. Дисплей выбран не очень удачно, ну очень медленный вывод. Я запустил на STM32F103RB — все работает, возможно в дальнейшем применю в своих разработках.
0
Ну если не лень — начни с транзистора, начинающим всяко полезно будет.
Да и гугл у всех есть, так бы и писал статью — заголовок, а остальное в гугле ищите…
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.