TFT_SetCursorPosition(0,0,127,159); f_open(&USBHFile, "5_16.bmp", FA_READ); uint32_t byte; unsigned int k; for(int i=0; i<(128*160)/2;i++) { f_read(&USBHFile, &byte, 4, &k); while(!(SPI1->SR & SPI_SR_TXE)); SPI1->DR = byte>>24; while(!(SPI1->SR & SPI_SR_TXE)); SPI1->DR = byte>>16; while(!(SPI1->SR & SPI_SR_TXE)); SPI1->DR = byte>>8; while(!(SPI1->SR & SPI_SR_TXE)); SPI1->DR = byte; while(!(SPI1->SR & SPI_SR_TXE)); }
1 пиксель==2 Байта.
i<(128*160)/2;
Ок, это связано с кодировкой .bmp изображения.
Надо разбираться как кодируются изображения каждого типа, чтоб их раскодировать.
Ок. Для интереса разберусь как .bmp и .jpg кодировать, декодировать.
1 пиксель в bmp кодируется 32 битами.
У меня на дисплее 16 бит это 1 пиксель.
Значит мне надо урезать bmp пиксель до 16 бит.
Здесь можно конвертировать из 4 байт в 2 Байта.
https://rgbcolorpicker.com/565
Это 4 х байтный код красного цвета #ff0103
1111 1111 0000 0001 0000 0011 1111 1111
Как из этого получить это 0xf800 ?
Не получилось у меня.
#ff0103==1111 1111 0000 0001 0000 0011
Получается единицы берутся или из Alpha или из синего цвета, этого не может быть ведь, цвет то красный должен быть.
Я напутал что то))
Из этого
1111 1111 0000 0001 0000 0011
RGB(888)
легко получается это
11111 000000 00000
RGB(565)
Позже перенесу в код.
Я посмотрел в HEX едиторе, в bmp первые 56 байт идёт какая то техническая информация.
Странно.
Сказано, что четырьмя байтами bmp кодируется, а в HEX едиторе я вижу 3 байта на пиксель.
Другую bmp открыл, там вообще 2 байта на пиксель.
Двумя байтами.
Третий байт наверное 00 и его не пишут
Проверьте сами
https://hexed.it/
И как такое декодировать тогда.
Для начала сконвертируйте изображение в нужный формат и нужный размер одной из программ.
А перевёрнутое и инверсное изображение управляется специальным регистром в контроллере дисплея.
А дальше будем разбираться.
ImageConverter565 конвертирует BMP в массив.
Мне это не надо, я это могу делать.
Image2Lcd конвертирует из BMP в формат RGB(555)
У меня дисплей в формате RGB(565)
Проще будет конвертировать из RGB(888) в RGB(565)
Но как я понял не все BMP почему то в формате RGB(888)
Но главное, BMP должны ведь 4 мя байтами кодироватья, а этого в HEX едиторе я не вижу.
>>А перевёрнутое и инверсное изображение управляется специальным регистром в контроллере дисплея.
Да, это я делал уже.
Непонятно почему BMP закодирован вверх ногами
Image2Lcd конвертирует из BMP в формат RGB(555)
А внимательнее посмотреть?
В этой программе есть настройка для конвертации в RGB(565)
Массив эта программа конвертирует правильно в RGB(565)
Но BMP в RGB(565) не конвертирует.
Конвертирую это изображение
Смотрите на результат конвертации с параметрами RGB(565)
0x7C00 == 0111 1100 0000 0000
Это RGB(555) а не RGB(565).
Моя цель немного в другом.
Не конвертировать сторонними программами, а разобраться в форматах.
Конвертировать проще финкциями.