Софт и утилиты
Сайт создан в системе uCoz
Приветствую Вас, Пробегающий мимо · RSS 28.03.2024, 15:43
Главная » Статьи » Утилиты » Графика

Bitmap2Code


Bitmap2Code
::
утилита конвертации изображений в код







Bitmap2Code (далее просто B2C ) представляет собой небольшую утилиту лицензии GPL, удобный инструмент с открытым исходным кодом для создания кода из
изображений в формате языка CИ настолько эффективно, насколько это возможно для микроконтроллерной платформы. Эти изображения потом отображаются на ЖК LCD. Утилита написана на C # для Visual Studio 2010 Express и была протестирована на Windows XP и Windows 7.


Работать с матричным ЖК-дисплеем с микроконтроллерами не так трудно, но утомительно из-за работы с командами ЖК только на низком уровне. Фактически большинство контроллеров ЖК дисплеев позволяет загружать простые визуальные данные - цвет точки, но не более того.Вывод же простых и сложных графических объектов зависит только от программного обеспечения и немаловажным бывает необходимость вывода изображений с максимальной экономией ресурсов микроконтроллера. Для этих целей и была написана данная утилита.



Практическое использование.

С помощью B2C можноконвертировать изображения практически с любым выходным форматом цвета на точку, тип выходных данных также может быть разным 8 или 16 бит.
Программа проста в использовании, в левой части находятся входное изображение и выходное после конвертации, если выходной формат цвета отличается от входного
.

 В правой части программы находятся настройки генерации кода такие как - выходной формат цвета, формат данных 8/16 бит, сжатие, поворот изображения на 90,180,270 градусов и зеркальное отражение по X и/или Y.
Там же находится собственно поля где
можно видеть выходной код изображения.

После открытия изображения и выставления необходимых настроек генерации нажмите генерировать, получив код сохраните файлы в меню File>Save.
Теперь можно подключать полученные файлы к проекту.

В си файле (*.c) находится непосредственно код изображения и структура с его параметрами, такими как ширина, высота, флаг сжатия, конечный индекс массива и указатель на массив данных. В заголовочном файле (*.h) находится объявление структуры параметров изображения как типа данных.

Функции вывода этого кода на ЖК могут быть различны для разных типов ЖК и/или их драйверов, приведу пример использования этого кода для вывода изображения в формате 16/16 бит цвет/данные на ЖК типа HX8352, сначала объявляем переменную параметров изображения как тип данных из заголовочного файла, для примера, изображение имеет имя Scheme_pictInfo:

extern const
BITMAP_INFO_8 Scheme_pictInfo;

Затем, для отрисовки изображения, вызываем функцию, передавая в нее начальные координаты отрисовки и указатель на только что объявленную переменную:

Draw_8_IMG(10, 20, &Scheme_pictInfo)
;


Содержание функции:

void Draw_8_IMG(uint16_t X0pos, uint16_t Y0pos, const *bitmap)
{
  uint16_t i;
 
  /* Устанавливаем область вывода ЖК на размер изображения */ 
  LCD_SetArea(X0pos, X0pos + IN_bitmap->Height, Y0pos, Y0pos + IN_bitmap->Width); 

  /* Выводим изображение */
  for (i = 0; i < massiveSize; i++ )  // Пробегаем все байты массива картинки
  {   
 
     LCD_PutPixel(
*(bitmap + i ));  // Рисуем пиксель   
   
  } 
}




Теперь кратко об алгоритме сжатия применяемого в программе, тип компрессии (RLE) выбран исходя из требований минимальной дополнительной нагрузки на микроконтроллер при выводе сжатого изображения, по другому этот тип сжатия называется кодирование длин серий,
подробнее можно почитать тут - Кодирование длин серий — Википедия.

Алгоритм RLE один из самых старых и самых простых алгоритмов архивации графики. Изображение в нем вытягивается в цепочку байт по строкам растра. Само сжатие в RLE происходит за счет того, что в исходном изображении встречаются цепочки одинаковых байт. Замена их на пары <счетчик повторений, значение> уменьшает избыточность данных.
Для примера возьмем 1 битное изображение где последовательно 128 раз повторяются черные точки, затем 3 не повторяющиеся точки и опять 128 раз подряд черные, тогда выходной массив примет вид как на изображении

Теперь разберем его, первый байт это всегда счетчик,
1 в старшем бите этого байта говорит нам что по следующему
индексу массива содержится данные которые нужно
повторить (0xFF - 0x80)+1 раз, в нашем случае это 127+1 = 128 раз.

 
Далее у нас в массиве стоит 0х2, так как в старшем бите этого байта нет единицы, то это означает что далее идут не повторяющееся данные количеством (значение этого байта + 1), в нашем случае 0x2+1 = 3. Отсчитываем 3 точки и видим что значение байта равно 0xFF, то есть ситуация аналогична начальной, опять повторяются черные точки 128 раз. Коэффициенты компрессии данного метода сжатия:  64, 3, 128/129. (Лучший, средний, худший коэффициенты) , он хорошо работает на простой малоцветовой графике и плохо на плавных переходах цветов.

Для вывода сжатого изображения как и для не сжатого сначала
объявляем переменную параметров изображения, для примера изображение имеет имя Scheme_pictInfo:

extern const
BITMAP_INFO_8 Scheme_pictInfo;


Вызов функции:

DrawCompressed_8_IMG(10, 20, &Scheme_pictInfo);


Содержание функции:

void DrawCompressed_8_IMG(uint16_t X0pos, uint16_t Y0pos, const *bitmap)
{
  uint16_t i, j;
 
 
/* Устанавливаем область вывода ЖК на размер изображения */ 
  LCD_SetArea(X0pos, X0pos + IN_bitmap->Height, Y0pos, Y0pos + IN_bitmap->Width); 


 
 
/* Выводим изображение */
  for (i = 0; i < massiveSize; i++ )  // Пробегаем все байты массива картинки
  {
    if ((*(bitmap + i) & 0x80) == 128) 
// Если байт повтора
    {
      for (j = 0; j < (*(bitmap + i) & 0x7F) + 1; j++) 
// раскодируем байт повтора и выводим количество байт записанное в нем
      {       
        LCD_PutPixel(
*(bitmap + i + 1));  // Рисуем повторяющийся пиксель
      }
      i++;  // переключаем указатель на следующий байт
    }
    else if ((*(bitmap + i) & 0x80) == 0)
// Если байт пропуска
    {
      for (j = 0; j < (*(bitmap + i) & 0x7F) + 1; j++)  // 
раскодируем байт пропуска и выводим количество байт записанное в нем
      {
        LCD_PutPixel(*
bitmap);  // Рисуем пиксель
      }
      i = i + (int)(*(bitmap + i) & 0x7F) + 1; 
// переключаем указатель на следующий байт после не повторяющихся пикселей
    }
  } 
}



Применять сжатие имеет смысл на простых изображениях, это может дать десятикратный (теоретически до 64 ) выигрыш  по размеру выходного массива и минимальные потери производительности при выводе изображения на ЖК.



Скачать


Чтобы запустить этот исполняемый файл, у вас должен быть установлен . NET Framework.

Пожалуйста, напишите мне в случае каких либо багов и/или с предложениями по функционалу программы (LeftRadio(собака)lavabit.com). Также можете оставить сообщение на форуме или здесь в комментариях.





Категория: Графика | Добавил: LeftRadio (21.08.2011)
Просмотров: 8979 | Рейтинг: 4.0/2
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]