Конвертер 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 значений.
Тест работы конвертера: Вывод тестовой картинки на ЖКИ.