Конвертер BMP файлов в Си-код, для ЖКИ SSD1309 (128x64).

 

    В одном из проектов понадобилось вывести графическое изображение на ЖКИ.

ЖКИ построен на основе контроллера SSD1309 с разрешением 128x64 точек, цвет 1 бит.

 

Для вывода изображения на ЖКИ требуется проделать следующею последовательность действий:

- Подготовить изображение (картинку). Например нарисовать, отредактировать изображение

в графическом редакторе или использовать готовое.

- Сохранить полученное изображение в файл, в формате BMP.

- Вставить полученный файл целиком или только сами графические данные в виде массива в СИ код.

  


Выбор графического формата файла. Почему BMP ?

 

    Формат BMP, это простой формат растрового изображения, который проще всего обрабатывать.

В начале файла находится заголовок, затем идет таблица цветов и сами данные в виде двумерного

массива (расположение данных построчное) с выравниваем по границе 4 байт, без упаковки (как

правило).

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

То есть в BMP файле картинка располагается в перевернутом виде, перевернута верх ногами.

 

Что вставлять в СИ код ?

 

    Вариант 1. Вставка BMP файла (целиком, как есть).

 

При этом придется добавить в проект парсер BMP файла. Формат простой поэтому с этим проблем нет.

    BMP файл содержит таблицу цветов которая является лишней так как не будет использоваться,

но при этом будет занимать место. Заголовок BMP + таблица цветов занимает около 1Кб, и при

современных объемах FLASH памяти микроконтроллеров этим объемом можно пожертвовать и не брать

во внимание.

    Также необходимо сделать конвертацию цветов для глубины цвета 1 бит, если BMP файл содержит

данные в формате отличном от 1 битного цвета.

    Сделать конвертацию расположения графических данных, тут уже сложнее.

Согласно документации на ЖКИ, данные располагаются построчно, каждая строка состоит из столбцов

величиной 8 бит, младший бит в верху.

 

 Выдержка из документации на SSD1309:

 

 

    Получается перед загрузкой данных в ЖКИ необходимо предварительно сформировать байт столбца

из данных от разных строк BMP файла. Также необходимо принять во внимание, что данные в BMP

могут/будут упакованы с словах в виде отдельных бит (1 бит - 1 точка) !

 

Внимание: Контроллер позволяет изменить порядок расположения выводимых данных, но суть

от этого не меняется.

 

    Формат расположение данных BMP логичен для вывода на монитор, принтер или другое подобное

устройство, но не согласуется с форматом вывода на ЖКИ с контроллером SSD1309.

    Так как графические данные (картинки) не будут меняться на протяжении всего времени работы

устройства, то получается нет необходимости в вставке BMP файлов целиком в проект.

    Вставляя в проект BMP как есть, получается неоправданное усложнение проекта. К тому же  придется

постоянно производить конвертацию данных из одного формата в другой. Будь то конвертация цветов

или конвертация расположения данных.

    Применяя BMP файлы в проекте как есть, со всеми накладными расходами, проект получается

универсальный и при этом избыточный.

    Универсальность как правило увеличивает количество глюков в системе, по причине необходимости

поддержки нескольких вариантов обработки данных. Несколько вариантов, это дополнительный код,

которые в свою очередь необходимо предварительно протестировать(покрыть тестами), а это допо-

лнительное время и силы.

    Вопрос, оно того стоит ?

    Поэтому чем проще система, тем меньше кода, меньше глюков, проще проводить тестирование. Как

следствие повышается надежность системы в целом.

 

Вариант 2. Использование предварительно подготовленных графических данных из BMP файла.

 

    Для этого необходимо написать программу конвертер для ПК, которая будет преобразовывать BMP

файл в нужный формат.

    Программа конвертер написана на Си, под ОС Windows, компилятор VisualStudio 2008.

Исходники программы находятся на GitHub-e, готовый exe-файл там же.

    Конвертер работает в консоли (командной строке). Конвертер принимает на вход файл в формате

BMP 8-битный цвет(256 градации серого) или 1-битный цвет, с любым разрешением (тестировалось

на файлах до 128х64).

    Вывод результатов работы осуществляется в консоль, или в файл заданный пользователем (при

перенаправление в файл). Пример cmd файла для конвертации BMP->TXT.

 

    Конвертер анализирует заголовок BMP файла по которому определяет разрешение и количество

цветов. Если конвертер что то не устраивает, то конвертер завершает работу с ошибкой.

    Затем выводится графическое представление BMP файла в виде точек определяемых символом "*"

(звездочка), для визуального контроля формируемых данных. Данное представление оказалось полезным

для отладки конвертера, позволяя просматривать саму картинку так как она будет выглядеть на ЖКИ.

(пример вывода)

 

 

    Для 8-битного цвета по умолчанию выставлен порог преобразования:

если Знач.Байта > 0 то бит ЖКИ = 1.

    Некоторые графические редакторы добавляли ели заметный шум в виде ореола, что приводило к

замусориванию картинки. Позже был добавлен режим преобразования BMP 1 битный цвет, что решило

данную особенность.

    Далее конвертер выводит массив строк данных, то как они будут выводиться на ЖКИ.

    В самом конце конвертер выводит текстовый массив для вставки в СИ код, в виде HEX значений.  


 

Тест работы конвертера: Вывод тестовой картинки на ЖКИ.