Найти в Дзене
Электроника, ESP32, Arduino

Цветопредставление в Windows и работа с ним на C# (отправка изображения с ПК в Arduino через UART часть 2).

Продолжаем раскрывать тему отправки изображений через последовательный порт, и отрисовки этих изображений на совсем не компьютерных дисплеях.

Задача будет сводиться к трем операциям:

  • прочитать данные о цвете исходного изображения;
  • cконвертировать эти данные в формат которые понимает дисплей подключенный к Arduino;
  • отправить эти данные в COM порт.

Все остальные операции, схему подключения данного дисплея к Arduino, алгоритм приема и отрисовки данных я описывал в прошлой статье.

Данный проект без лишних наворотов - отправляет картинку которая лежит в папке с "екзешником" при нажатии на кнопку, просто чтобы показать общий принцип работы.

-2

Для работы с изображениями нам потребуется класс Bitmap. Он инкапсулирует точечный рисунок GDI+, состоящий из данных пикселей графического изображения и атрибутов рисунка. Ничего не понятно, но очень интересно. Но на самом деле все просто.

Строчка кода:

-3

создает новый экземпляр класса Bitmap из указанного существующего изображения. Данный конструктор умеет работать с изображениями в следующих форматах файлов: BMP, GIF, EXIF, JPG, PNG и TIFF.

И в этом вся прелесть ООП - нам не нужно ничего знать про то как организовано хранение цвета в любом из этих форматов - данные о цвете мы сможем получить используя метод Bitmap.GetPixel(Int32, Int32). Данный метод возвращает данные в структуру Color и все что нам останется сделать - это вычитать данные из этой структуры.

-4

Вообще там 4 однобайтовых значения - но мне к ним придется применять битовые операции - поэтому сохраним всё как "интовые" переменные.

Именованные цвета представляются с помощью свойств структуры Color. Цвет каждого пикселя представлен в виде 32-разрядного числа: 8 бит для альфа-, красного, зеленого и синего (ARGB). Каждый из четырех компонентов представляет собой число от 0 до 255, при этом 0 означает отсутствие интенсивности, а 255 — полную интенсивность. Альфа-компонент указывает прозрачность цвета: 0 означает полную прозрачность, а 255 — полную непрозрачность. Чтобы определить альфа-, красный, зеленый или синий компонент цвета, используйте A,R,G или B соответственно.

Про альфа-компонент наш дисплей ничего не знает, а с остальными цветами у нас возникают "необычные обстоятельства", потому что в структуре цвет хранится в виде 3-х байт, а дисплей понимает их только в виде 2-х. Старшие биты 3-х байтов в "майкрософт форточках", необходимо будет растащить по 2 байтам для дисплея подключенного к ардуино. Код пишем строго по этой картинке:

-5

s1 первый байт для дисплея, s2 соответственно второй. Таким образом для конвертации 1 (одного) пикселя код будет выглядеть следующим образом:

-6

Битовая маска сбрасывает лишние биты, там где их не сбрасывает операция сдвига. Затем нам нужно будет обойти всю картинку сначала по столбцам, потом по строкам (именно в таком порядке дисплей подключенный к Arduino может принимать данные) - потребуется вложенный цикл вида:

-7

Все остальное элементы кода я разбирал в прошлой статье:

-8

EXE-шник с картинкой можно скопировать в отдельную папку

-9

Кнопка OPEN открывает COM порт

Кнопка TEST рисует "матрас" (смотри прошлую статью)

-10

Кнопка SEND посылает картинку из папки

-11

Кнопка CLOSE закрывает COM порт

Все исходники тута

CSharp18.10.23.zip

Оглавление канала тут

Продолжение следует... Всем удачи!