Adafruit RGB матрица и bmp

Тема в разделе "Arduino & Shields", создана пользователем dimksum, 16 май 2014.

  1. dimksum

    dimksum Нерд

    Добрый день. Имеется Adafruit 32х32 RGB матрица.

    Все примеры из библиотек RGB Matrix Panel и Adafruit GFX Library прекрасно работают. Необходимо вывести bmp картинку.

    Есть пример colorwheel_progmem_32x32 в котором изображение храниться в PROGMEM. Начинаю разбираться. Количество светодиодов в матрице 1024, а в image.h хранится 1528 значений. Каждый цвет может быть представлен 3мя или 4мя битами. В данном примере изображение выводится из буфера, я так понимаю, с помощью функции

    Код (Text):

    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) в цикле выводить это на матрицу?

    Заранее спасибо за ответы!
     
  2. Megakoteyka

    Megakoteyka Оракул Модератор

    Файл на карте всяко универсальней будет. Да и редактировать проще графический файл в графическом редакторе, нежели хидер в текстовом.
     
    Mitrandir нравится это.
  3. dimksum

    dimksum Нерд

    С картой то конечно лучше будет, но вот как вывести изображение хоть с карты хоть с h-ки??
     
  4. Megakoteyka

    Megakoteyka Оракул Модератор

    Прежде всего нужно научиться управлять отдельным светодиодом.
    Посмотрите, как работает функция drawPixel(x+i, y+j, color);
    С этим разобрались?
     
  5. dimksum

    dimksum Нерд

    Да, х у координаты пикселя, color его цвет в 16 битном формате
     
  6. Megakoteyka

    Megakoteyka Оракул Модератор

    Можно завести картинку прямо в исходнике в виде двумерного массива (матрицы) - тогда рисовать можно, просто пробегая матрицу двойным циклом.
    В случае с файлом придется изучить его формат и преобразовать линейную последовательность в ту же матрицу. Причем не нужно формировать матрицу, нужно просто составить несложную формулу, по которой на основе x и y будет вычисляться порядковый номер пикселя в файле.
     
  7. dimksum

    dimksum Нерд

    Вопрос как раз в том и есть, что необходимо преобразовать картинку в массив значений цвета, а потом в цикле выводить это на матрицу. Есть конвертер для LCD дисплеев http://www.henningkarlsen.com/electronics/t_imageconverter565.php но он преобразовывает в формат RGB565 а для матрицы небходимо RGB333 или RGB444.
     
  8. Megakoteyka

    Megakoteyka Оракул Модератор

    Формат файла: http://ru.wikipedia.org/wiki/BMP
    Наверное, имеет смысл сохранять картинку в таком формате, который проще будет читать и обрабатывать.
    Например, картинка должна быть без сжатия - тогда пиксели будут лежать в виде простого двумерного массива.

    Если лень разбирать структуру формата, можете поступить следующим образом: создать некий эталоный файл с простым изображением (например, черный прямоугольник на белом фоне), затем открыть файл в HEX-редакторе и анализировать его. Несколько файлов с разными изображениями помогут понять структуру данных.
    Не факт, что этот метод проще, но я иногда использовал подобный подход для вскрывания форматов и он вполне работоспособен, хоть и не во всех случаях. Файл со сжатием так расковырять не получится.
     
  9. dimksum

    dimksum Нерд

    Вот почему и был взят за основу BMP файл. Вопрос только в цветовой перекодировке, понятной для матрицы
     
  10. Megakoteyka

    Megakoteyka Оракул Модератор