оптимизация кода картинок и иконок

multimax
Offline
Зарегистрирован: 07.11.2017

Завис я на рисовании иконок для своего радиоприемника на Арудино НАНО и si4703, библиотека u8g. OLED дисплей сине-черный. Мне показалось наиболее удобным рисовать попиксельно. Но вот возникла мысль... описывая каждый пиксель в скетче двумя параметрами x и y, не трачу ли я почем зря память ардуинки? Что занимает меньше памяти, drawpixel или drawcircle, drawline? Может действительно стоит замарочиться и рисовать кружки и линии, для уменьшения размера кода? но то что мы видим много строк в скетче не означет, что машинного кода будет такое же количество... Кто может подсказать?

multimax
Offline
Зарегистрирован: 07.11.2017

b707
Offline
Зарегистрирован: 26.05.2017

ну вообще-то никто не хранит каждый пиксель в виде пары x и y. - обычно рисунки хранят целиком в виде пиксельной матрицы, примерно так же, как кодируются буквы в экранных шрифтах

multimax
Offline
Зарегистрирован: 07.11.2017

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

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

  //батарейка пустая
u8g.drawVLine(127, 0, 8);

u8g.drawPixel(126,0);
u8g.drawPixel(125,0);
u8g.drawPixel(124,0);  
u8g.drawPixel(123,0);  
u8g.drawPixel(122,0);  
u8g.drawPixel(121,0); 
u8g.drawPixel(120,0); 
u8g.drawPixel(119,0); 
u8g.drawPixel(118,0);
u8g.drawPixel(117,0);
u8g.drawPixel(116,0);
u8g.drawPixel(115,0);
u8g.drawPixel(114,0);
u8g.drawPixel(113,1);

// пипка
u8g.drawPixel(112,3);
u8g.drawPixel(112,4);
u8g.drawPixel(113,3);
u8g.drawPixel(113,4);
// end пипка


u8g.drawPixel(126,7);
u8g.drawPixel(125,7);
u8g.drawPixel(124,7);  
u8g.drawPixel(123,7);  
u8g.drawPixel(122,7);  
u8g.drawPixel(121,7); 
u8g.drawPixel(120,7); 
u8g.drawPixel(119,7); 
u8g.drawPixel(118,7);
u8g.drawPixel(117,7);
u8g.drawPixel(116,7);
u8g.drawPixel(115,7);
u8g.drawPixel(114,7);

u8g.drawPixel(113,6);

 

b707
Offline
Зарегистрирован: 26.05.2017

скорее всего, в виде готовых примитивов будет некоторый выигрыш, но вряд ли существенный. Повторюсь - вам надо кодировать картинки в виде матриц - так вы выиграете в разы больше, чем с помощью линий и кривых. Например, ваша "батарейка" в виде матрицы займет всего 14 байт.

multimax
Offline
Зарегистрирован: 07.11.2017

2 вопроса. как эту матрицу вставить в нужное место на экране? и где ее хранить :) если есть пример... буду рад ссылке...

multimax
Offline
Зарегистрирован: 07.11.2017

а! и еще важный момент... моя батарейка интегрирована в код-вольтметр. палочки выводятся в зависимости от напряжения на А0 контакте... вот :) стоит несколько условий if, в каждом условии свой диапазон вольтажа, и свои пиксели для вывода... сможет ли матрица сделать тоже самое?)

b707
Offline
Зарегистрирован: 26.05.2017

multimax пишет:

а! и еще важный момент... моя батарейка интегрирована в код-вольтметр. палочки выводятся в зависимости от напряжения на А0 контакте... вот :) стоит несколько условий if, в каждом условии свой диапазон вольтажа, и свои пиксели для вывода... сможет ли матрица сделать тоже самое?)

в таких случаях оказывается проще либо предусмотреть несколько матриц. либо просто хранить их частями.

b707
Offline
Зарегистрирован: 26.05.2017

multimax пишет:

2 вопроса. как эту матрицу вставить в нужное место на экране? и где ее хранить :) если есть пример... буду рад ссылке...

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

Гриша
Offline
Зарегистрирован: 27.04.2014

может я и не прав но идея такая...

этот кусок кода
u8g.drawPixel(126,7);
u8g.drawPixel(125,7);
u8g.drawPixel(124,7);  
u8g.drawPixel(123,7);  
u8g.drawPixel(122,7);  
u8g.drawPixel(121,7); 
u8g.drawPixel(120,7); 
u8g.drawPixel(119,7); 
u8g.drawPixel(118,7);
u8g.drawPixel(117,7);
u8g.drawPixel(116,7);
u8g.drawPixel(115,7);
u8g.drawPixel(114,7);


будет типа
for (int ii=126, ii>=114, ii--)
{
int ij=7;
u8g.drawPixel(ii,ij);
}

 

multimax
Offline
Зарегистрирован: 07.11.2017

интересное решение :) программерское. но это так неудобно :( потом поправить сложнее мне кажется. нет ли какой-то программы, чтобы в ней на компе нарисовать мышкой, и получить на выходе оптимизированный код? в виде drawpixel или в похожем как у вас изящном виде? я рисовал все  иконки на скриншоте на глаз))) внес пару пикселей, загрузил код... посмотрел))) долго... неудобно...

sadman41
Offline
Зарегистрирован: 19.10.2016

Гугел выводит вот сюда: https://geektimes.ru/post/254998/ , в первых камментах наводка.

Гриша
Offline
Зарегистрирован: 27.04.2014

del