Графика для TFT LCD

Графика LCD

Статья полезна желающим использовать векторную графику в своих LCD экранах для ардуино.

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

Тестируемое железо:

Arduino MEGA + TFT LCD Shield 3” Open-Smart + библиотека Adafruit_GFX.h

Создаём такую кнопку меню:

1) Открываем Иллюстратор (Корел или Inkscape) и создаём документ размером, как наш экран

Главное размеры в пикселах.

2) Ваяем с учётом возможностей нашей библиотеки, т.е. необходимо использовать только окружность, прямоугольник, прямоугольник со скруглёнными углами и треугольник. Причём, поворачивать прямоугольник нельзя – сие необходимо разбивать на треугольники:

Ещё одно ограничение – не использовать градиенты и кривые .

3) Картинка BMP на моём железе отображается за 0,1 секунду. Векторный формат не на много, но быстрее. Плюс можно использовать прозрачности.

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

4) Сохраняем как SVG. Если использовать всю монтажную область, то получим абсолютные координаты на экране. Если объект поставить в нулевые координаты, то можно прибавляя некую дельту рисовать кнопку в любом месте экрана.

Главное в сохранении это: ТИП = SVG, Качество = 1, CSS = элементы стилей, кодировка.

5) В полученном SVG нас интересуют строки вида:

.st2{fill:#2E3192;} – это класс с цветом

<circle class="st2" cx="31" cy="31" r="26.4"/> – это окружность

<rect x="4.5" y="151.4" class="st2" width="51.3" height="24.2"/> – это прямоугольник

<polygon class="st11" points="30.1,32.8 35.9,32.8 35.9,46.1 30.1,46.1 30.1,32.8 "/> – это треугольник

6) Цвет любым способом из интернет формата переведите в RGB

#1B1464;} // tft.color565(27, 20, 100)

#2E3192 = tft.color565(46, 49, 146)

#0071BC = tft.color565(0, 113, 188)

#29ABE2 = tft.color565(41, 71, 226)

7) Окружность

<circle class="st2" cx="31" cy="31" r="26.4"/> переписываем в вид

tft.fillCircle(31, 31, 26, tft.color565(46, 49, 146));

Цветом показал одинаковые по смыслу позиции. Если переписывать вручную, то можно округлять до целого числа, хотя дробное к ошибке не приводит и на качество не влияет.

8) Прямоугольник

<rect x="4.5" y="151.4" class="st2" width="51.3" height="24.2"/> переписываем в вид

tft.fillRect(5, 151, 51, 24, tft.color565(46, 49, 146));

Если прямоугольник создан полигонами, то строку

<polygon class="st11" points="18.3,28.8 44.7,28.8 44.7,33.4 18.3,33.4 18.3,28.8 "/>

переписываем в вид

tft.fillRect(18, 29, 45-18, 33-29, tft.color565(46, 49, 146));

в полигонах пишутся координаты точек, образующие фигуру

points="x1,y1 x2,y2 x3,y3 x4,y4 x1,y1 "/>

Из координат вершин легко вычислить ширину и высоту прямоугольника поэтом 45-18 и 33-29.

9) Треугольник

<polygon class="st12" points="47.9,29.4 31.5,13.9 15.1,29.4 "/> переписываем в вид

tft.fillTriangle(48 , 29, 32, 14, 15, 29, tft.color565(46, 49, 146));

10 ) Линия

<line class="st12" x1="18.1" y1="216" x2="42.8" y2="216"/>

tft.drawLine(18, 216, 43, 216, tft.color565(46, 49, 146));



Таким образом, наша иконка домика будет отрисована кодом:

tft.fillCircle(31, 31, 26, tft.color565(34, 65, 128));

tft.fillCircle(31, 31, 25, tft.color565(118, 200, 216));

tft.fillCircle(31, 31, 24, tft.color565(0, 124, 191));

tft.fillCircle(31, 31, 21, tft.color565(0, 140, 204));

tft.fillCircle(31, 31, 19, tft.color565(0, 155, 214));

tft.fillCircle(31, 31, 17, tft.color565(0, 170, 219));

tft.fillCircle(31, 31, 15, tft.color565(42, 183, 222));

tft.fillRect(38, 17, 4, 7, tft.color565(255, 255, 255));

tft.fillRect(18, 32, 6, 13, tft.color565(255, 255, 255));

tft.fillRect(30, 33, 5, 13, tft.color565(255, 255, 255));

tft.fillRect(35, 40, 10, 6, tft.color565(255, 255, 255));

tft.fillRect(41, 33, 4, 7, tft.color565(255, 255, 255));

tft.fillRect(18, 29, 27, 4, tft.color565(255, 255, 255));

tft.fillTriangle(50 , 29, 32, 14, 14, 29, tft.color565(255, 255, 255));



Исходный SVG объект: