Top.Mail.Ru
Уведомления
Очистить все

[Решено] Вывод изображения на дисплей ILI9341.

 stm
(@stm)
Level 4
Почему изображение вверх ногами, инвертировано и плохого качества?
Какая то ошибка в коде.
 
Вывожу изображение на дисплей таким кодом:
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));
}
 
*Это код нужный для объяснения проблемы, то есть конечно не весь.
Изображение лежит на USB носителе.
SPI1->DR регистр 8 битовый.
Размеры изображения 128х160.
С координатами проблем нет, они правильные.
 
Здесь получаю 4 байта из изображения f_read(&USBHFile, &byte, 4, &k);
И по порядку кодирую этими байтами пиксели.
1 пиксель==2 Байта.
За один цикл кодируется 2 пикселя, поэтому в цикле for
i<(128*160)/2;
 
Я выводил изображение на дисплей с помощью текстового массива, который лежал на USB носителе.
Изображение получалось правильное, не вверх ногами и не инвертированное.
Цитата
Создатель темы Размещено : 16.11.2023 01:09
 stm
(@stm)
Level 4

Ок, это связано с кодировкой .bmp изображения.
Надо разбираться как кодируются изображения каждого типа, чтоб их раскодировать.
Ок. Для интереса разберусь как .bmp и .jpg кодировать, декодировать.

ОтветитьЦитата
Создатель темы Размещено : 16.11.2023 02:22
 stm
(@stm)
Level 4

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 или из синего цвета, этого не может быть ведь, цвет то красный должен быть.

pix
ОтветитьЦитата
Создатель темы Размещено : 16.11.2023 03:02
 stm
(@stm)
Level 4

Я напутал что то))
Из этого
1111 1111 0000 0001 0000 0011‬

RGB(888)
легко получается это
11111 000000 00000

RGB(565)
Позже перенесу в код.
Я посмотрел в HEX едиторе, в bmp первые 56 байт идёт какая то техническая информация.

ОтветитьЦитата
Создатель темы Размещено : 16.11.2023 03:17
 stm
(@stm)
Level 4

Странно.

Сказано, что четырьмя байтами bmp кодируется, а в HEX едиторе я вижу 3 байта на пиксель.
Другую bmp открыл, там вообще 2 байта на пиксель.

ОтветитьЦитата
Создатель темы Размещено : 16.11.2023 03:30
 stm
(@stm)
Level 4

Двумя байтами.
Третий байт наверное 00 и его не пишут
Проверьте сами
https://hexed.it/

vorSquare

И как такое декодировать тогда.

ОтветитьЦитата
Создатель темы Размещено : 16.11.2023 03:38
(@eduard)
Level 4 Moderator

Для начала сконвертируйте изображение в нужный формат и нужный размер одной из программ.

А перевёрнутое и инверсное изображение управляется специальным регистром в контроллере дисплея.

А дальше будем разбираться.

 

ОтветитьЦитата
Размещено : 16.11.2023 06:08
 stm
(@stm)
Level 4

@eduard 

ImageConverter565 конвертирует BMP в массив.
Мне это не надо, я это могу делать.
Image2Lcd конвертирует из BMP в формат RGB(555)
У меня дисплей в формате RGB(565)
Проще будет конвертировать из RGB(888) в RGB(565)
Но как я понял не все BMP почему то в формате RGB(888)

Но главное, BMP должны ведь 4 мя байтами кодироватья, а этого в HEX едиторе я не вижу.

ОтветитьЦитата
Создатель темы Размещено : 16.11.2023 12:30
 stm
(@stm)
Level 4

>>А перевёрнутое и инверсное изображение управляется специальным регистром в контроллере дисплея.
Да, это я делал уже.
Непонятно почему BMP закодирован вверх ногами

ОтветитьЦитата
Создатель темы Размещено : 16.11.2023 12:39
(@eduard)
Level 4 Moderator

Запись от: @stm

Image2Lcd конвертирует из BMP в формат RGB(555)

А внимательнее посмотреть?

ОтветитьЦитата
Размещено : 16.11.2023 18:34
 stm
(@stm)
Level 4

В этой программе есть настройка для конвертации в RGB(565)

pixel

Массив эта программа конвертирует правильно в RGB(565)
Но BMP в RGB(565) не конвертирует.

Конвертирую это изображение

RED

Смотрите на результат конвертации с параметрами RGB(565)

pixel3

0x7C00 == 0111 1100 0000 0000‬
Это RGB(555) а не RGB(565).

ОтветитьЦитата
Создатель темы Размещено : 16.11.2023 19:04
 stm
(@stm)
Level 4

Моя цель немного в другом.
Не конвертировать сторонними программами, а разобраться в форматах.
Конвертировать проще финкциями.

ОтветитьЦитата
Создатель темы Размещено : 16.11.2023 20:33
(@eduard)
Level 4 Moderator
ОтветитьЦитата
Размещено : 16.11.2023 21:08
Поделиться: