Adafruit RGB матрица и bmp
- Войдите на сайт для отправки комментариев
Добрый день. Имеется Adafruit 32х32 RGB матрица.
Все примеры из библиотек RGB Matrix Panel и Adafruit GFX Library прекрасно работают. Необходимо вывести bmp картинку.
Есть пример colorwheel_progmem_32x32 в котором изображение храниться в PROGMEM. Начинаю разбираться. Количество светодиодов в матрице 1024, а в image.h хранится 1528 значений. Каждый цвет может быть представлен 3мя или 4мя битами. В данном примере изображение выводится из буфера, я так понимаю, с помощью функции
void Adafruit_GFX::drawBitmap(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t color) { int16_t i, j, byteWidth = (w + 7) / 8; for(j=0; j<h; j++) { for(i=0; i<w; i++ ) { if(pgm_read_byte(bitmap + j * byteWidth + i / 8) & (128 >> (i & 7))) { drawPixel(x+i, y+j, color); } } } }
но количество значений не совпадает. Начал уже разбираться с форматом bmp файла.
Помогите разобраться с выводом графики на матрицу, с преобразованием bmp изображения в PROGMEM или может стоит попробовать размещать изображение на sd карте а потом вытаскивать значения цвета из определённой области файла и с помощью matrix.drawPixel (matrix.Color333 или matrix.Color444) в цикле выводить это на матрицу?
Заранее спасибо за ответы!
Ребят, очень сильно нужно решить вопрос. Готов подкинуть на пивко (сок) по результатам. Help!!!
а причем здесь BMP. у вас сконвертированное изображение в массив байтов. в нокиевских дисплеях например обычно люди используют 16 бит на цвет(да и я, так проще). нужно посмотреть вашу картинку, точнее код чтобы понять как там все устроено. и желательно оригинал картинки
Картинку конвертировал через
http://www.henningkarlsen.com/electronics/t_imageconverter565.php
проблема в том, что изображение в примере кодировано в uint8_t и значений намного больше чем 32х32 пикселя, а по ссылке идёт кодировка в uint16_t. Картинка используется любая размером 32х32рх
если 8битный у вас пример. какая же там кодировка цвета. может там просто также 16 бит на цвет, но записывается 2 байта по отдельности
откройте в любом редакторе и посмотрете сколько у вас значений в массиве для 32х32 пикселей. не 2048 случаем. посчитайте сколько в строке и умножте на количество строк
Конвертер делает 1024 16ти битных значений, а в примере с либой (image.h) 1528 8ми.
получается 12бит на цвет. причет для одного пискселя берется 1байт и половина соседнего байта. мда не очень удобно
я такого конвертера даже не видел. лучше переходите на 16 бит на цвет
хотя уже у вас либа есть. нужен конвертер
только не понял изображение из примера не выводится нормлаьно?
Изображение из примера выводится отлично! Нужен либо конвертер, либо подправить либу чтоб можно было выводить свои изображения
попробуйте вывести такое изображение
ничего нет :(
вообще? как минимум мусор должен быть. пример загрузите и проверьте все работает или нет
как вставляли код?
Всё перепроверил, демо работает. Код вставлял как обычно, скопировал из форума и вставил в h-ку
понятно. точнее непонятно почему даже мусора нет
во во
ну тогда только либу переписывать на 16бит
И чего неудобно в 12-битной кодировке? этож то же самое что Quoted-printable, только вдвое длиннее (или короче?). Короче не важно, важно что примеры работают, формат известен, но левый конвертер обломал весь кайф из-за несоответствия кодировки.
Вывод очевиден.
Курочить библиотеку не надо. Мутить 16-битную кодировку в скетче тоже не надо, это потребует на треть бОльшего объёма оперативной памяти. Надо написать свой собственный конвертер, с дамами и картишками - имхо, это будет самое простое решение. Так как некогда я занимался баловством с LSB стеганографией для BMP файла, думаю не будет особенно сложно что-то подобное зафигачить. Тем более что запись будет не обратно в BMP, а в виде простого текста.
Пишу на FPC. Если собрать exe-шник, на него ругается Аваст; впрочем это болезнь многих консольных компиляторов типа gcc и т. п. Лечится исключениями.
Сразу предупреждаю что может возникнуть проблема с преобразованием цвета (имеется в виду из полноцветной картинки), но как я понимаю - 12 бит это три цвета, значит палитра 16 цветов. В фотошопе привести картинку к 16 цветам можно, так что это вроде бы тоже решаемо.
Итак, жду массива (который в image.h) который выводит рабочую картинку, плюс оригинал картинки. Это достаточно интересная задача, чтобы подумать.
Кстати, для антивирусов возможны костыли. Можно, к примеру, перевести программу на PHP и запустить на заранее установленном Denwer'е (такой домашний web-сервер, иначе выражаясь - маленький интернет на собственном компьютере). Но ессно это костыли, т. к. вывод будет дольше, плюс PHP имеет отграничение на время выполнения, ну и в общем - костыли. Но возможно.
Короче, одну задачу возможно решить множеством способов.
12 бит делается просто. берется 4 старших бита от каждого цвета. но это нужно уметь писать программы для windows или другой фигни
а насчет конвертета вы зря. очень удобная штука. поддерживает несколько самых распрастранненых кодировок и меня полностью устраивает
jeka_tm
Ну я не говорю что конвертер совсем негодный, но я так понимаю что автору темы не подходит.
Просто можно запилить свой.
если вы можете написать программу и есть время помогите ТС, я уже написал как разбить цвета
у одного меня если 1024 умножить на 12 бит получается 1536, что совсем не 1528?
не поверил и проверил. в h файле таки 1536 байт.
насчет количества я тоже заметил, но это неважно. принцип важнее. таких конвертеров я не встречал
если посмотреть h файл, то сильно смутно там 12 бит закодировано.
а что тогда? если 16 бить то зачем разбивать?
почитайте либу к модулю, там что нибудь должно быть написано про кодировку цвета
Конец дампа изменяется, и плюс там не нули, хотя по логике кодировки, при заливке чёрным цветом, дожны быть нули. Кодировка 5,6,5, И есть лишние 16 байт (всего 194*8=1552, а картинка - 32*32*3*4/8=1536) и хз как они заполняются. В общем, создатели либы явно что-то умалчивают.
Зато у библиотеки есть функция преобразования цвета из нормальной кодировки (3,3,3 или 4,4,4) и вывод. Так что можно сделать "чёрный ящик"-преобразователь картинки, принимающий картинку по сериалу в удобоваримом формате, а назад отдающий дамп. Скармливать "ящику" исходную картинку будет программа, работающая с FTDI драйвером, чтобы не заниматься копипастой через Serial monitor.
Щас попробую запилить, и посмотрим как результат.
показывает что-нибудь?
если не хочет, может быть в конце надо дописать:
или то же самое, но с нулями.
Сорри за молчание, выходные....
Код показывает на белом фоне диагональные голубые линии, местами в этих линиях есть жёлтые и фиолетовые цвета
Модераторы, перенесите тему в ветку "Ищу исполнителя"
maloicds, должен быть такой вырвиглазный котэ:
хоть малость похожа картинка на него?
Желательно фотку сделать.
Котэ зачётный, а вот картинка не похожа на то, что на матрице :(
Поменял цикл, может быть так:
хотя по мне, много белого (0xFF), но хз может картинка такая, в 16 цветах непонятно.
ваще хз, что можно было упустить, ибо программа проста как свободный затвор. Вот сам исходник:
Для сборки необходим FPC и библиотека FTDI (назвать d2xxunit.pp, положить в том же каталоге где исходник):
Принцип действия:
1. проверяем командную строку, открываем файлы (оба файла должны существовать, т. е. второй .h файл нужно создать). Создать можно командой type nul>image.h
2. читаем первые 54 байта из BMP, берём оттуда высоту и ширину, считаем padding.
3. открываем FTDI USB утсройство. Если нету, выходим. Если много (больше одного), показываем список, спрашиваем выбор.
4. делаем установку (чётность, скорость и т. п.)
5. читаем картинку построчно, пишем в буфер построчно наоборот (31-ю полосу в самый верх и т. д. до 0-й полосы, т. к. в BMP строки записаны снизу вверх, т. е. наоборот).
6. посылаем в сериал по FTDI, весь буфер (32*32 пикс * 3 цвета = 3072 байта)
7. приняв картинку, цикл в ответчике на Arduino сделает команду снять дамп, послав по сериалу. Читаем дамп, целиком. Его размер 8522 байта.
8. пишем в выходной файл с 5-го байта (пропускаем первые два перевода строки).
9. закрываем FTDI устройство
10. закрываем файлы.
Код ответчика (скетч, делающий matrix.drawPixel() каждые 3 байта из сериала, затем дамп):
Если есть картинка из примера colorwheel_progmem, она была бы кстати. Не фотка матрицы, показывающей картинку, а сама картинка 32x32, в BMP.
Опять кроме белого фона и пару засвеченных пикселей ничего нет. Может стоит попробовать с 2мя цветами и простенькой картинкой (например квадрат пополам)?
Нужно найти оригинал этой картинки. Необходимо.
С простыми картинками тоже куча FF в дампе.