Продолжаем раскрывать тему отправки изображений через последовательный порт, и отрисовки этих изображений на совсем не компьютерных дисплеях.
Задача будет сводиться к трем операциям:
- прочитать данные о цвете исходного изображения;
- cконвертировать эти данные в формат которые понимает дисплей подключенный к Arduino;
- отправить эти данные в COM порт.
Все остальные операции, схему подключения данного дисплея к Arduino, алгоритм приема и отрисовки данных я описывал в прошлой статье.
Данный проект без лишних наворотов - отправляет картинку которая лежит в папке с "екзешником" при нажатии на кнопку, просто чтобы показать общий принцип работы.
Для работы с изображениями нам потребуется класс Bitmap. Он инкапсулирует точечный рисунок GDI+, состоящий из данных пикселей графического изображения и атрибутов рисунка. Ничего не понятно, но очень интересно. Но на самом деле все просто.
Строчка кода:
создает новый экземпляр класса Bitmap из указанного существующего изображения. Данный конструктор умеет работать с изображениями в следующих форматах файлов: BMP, GIF, EXIF, JPG, PNG и TIFF.
И в этом вся прелесть ООП - нам не нужно ничего знать про то как организовано хранение цвета в любом из этих форматов - данные о цвете мы сможем получить используя метод Bitmap.GetPixel(Int32, Int32). Данный метод возвращает данные в структуру Color и все что нам останется сделать - это вычитать данные из этой структуры.
Вообще там 4 однобайтовых значения - но мне к ним придется применять битовые операции - поэтому сохраним всё как "интовые" переменные.
Именованные цвета представляются с помощью свойств структуры Color. Цвет каждого пикселя представлен в виде 32-разрядного числа: 8 бит для альфа-, красного, зеленого и синего (ARGB). Каждый из четырех компонентов представляет собой число от 0 до 255, при этом 0 означает отсутствие интенсивности, а 255 — полную интенсивность. Альфа-компонент указывает прозрачность цвета: 0 означает полную прозрачность, а 255 — полную непрозрачность. Чтобы определить альфа-, красный, зеленый или синий компонент цвета, используйте A,R,G или B соответственно.
Про альфа-компонент наш дисплей ничего не знает, а с остальными цветами у нас возникают "необычные обстоятельства", потому что в структуре цвет хранится в виде 3-х байт, а дисплей понимает их только в виде 2-х. Старшие биты 3-х байтов в "майкрософт форточках", необходимо будет растащить по 2 байтам для дисплея подключенного к ардуино. Код пишем строго по этой картинке:
s1 первый байт для дисплея, s2 соответственно второй. Таким образом для конвертации 1 (одного) пикселя код будет выглядеть следующим образом:
Битовая маска сбрасывает лишние биты, там где их не сбрасывает операция сдвига. Затем нам нужно будет обойти всю картинку сначала по столбцам, потом по строкам (именно в таком порядке дисплей подключенный к Arduino может принимать данные) - потребуется вложенный цикл вида:
Все остальное элементы кода я разбирал в прошлой статье:
EXE-шник с картинкой можно скопировать в отдельную папку
Кнопка OPEN открывает COM порт
Кнопка TEST рисует "матрас" (смотри прошлую статью)
Кнопка SEND посылает картинку из папки
Кнопка CLOSE закрывает COM порт
Все исходники тута
Оглавление канала тут
Продолжение следует... Всем удачи!