Differences between revisions 1 and 2
Revision 1 as of 2016-11-09 14:53:17
Size: 5578
Editor: FrBrGeorge
Comment:
Revision 2 as of 2016-11-09 15:17:37
Size: 7670
Editor: FrBrGeorge
Comment:
Deletions are marked like this. Additions are marked like this.
Line 2: Line 2:

=== Ставить точки или обрабатывать области ===
Line 13: Line 11:
=== Ставить точки руками или обрабатывать области магией? ===
Line 16: Line 16:
Line 25: Line 26:
Довольно интересный компромисс в этом плане — формат [[RW:X_Pixmap|X Pixmap]] Довольно интересный компромисс в этом плане — формат [[RW:X_Pixmap|X Pixmap]].

Вот, например, [[attachment:rbomb.xpm|маленькая картинка]] в формате xpm: {{attachment:rbomb.png}}
А вот ''тот же самый файл'' непосредственно:
{{{#!highlight c
/* XPM */
static char * rbomb_xpm[] = {
/* width height ncolors chars_per_pixel */
"32 32 5 1",
/* colors */
" s None c None",
"o c gray50",
"O c black",
"$ c red",
"% c #B0B0B0",
/* pixels */
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" oOoOo ",
" O Oo ",
" o O ",
" O o ",
" OOOOO O ",
" OOOOO o ",
" OOOOOOO O ",
" oOOOOOOOOOo o $ $",
" oOOOOOOOOOOOo O $ $ ",
" oOOOOOOOOOOOOOo o $ ",
" OOOOOOOO%ooOOOO O $ $ ",
" oOOOOOOOOO%ooOOOo o $ $ ",
" OOOOOOOOOOOOOOOOO OoO $ $ $",
" OOOOOOOOOOO%ooOOO $$ ",
" OOOOOOOOOOO%ooOOO $ $ ",
" OOOOOOOOOOO%ooOOO $ $ ",
" OOOOOOOOOOOOOOOOO $ ",
" oOOOOOOOOOOOOOOOo $ $ $",
" OOOOOOOOOOOOOOO ",
" oOOOOOOOOOOOOOo $ ",
" oOOOOOOOOOOOo ",
" oOOOOOOOOOo ",
" oOOOOOo ",
" "};
}}}

То есть сам формат — '''строго текстовый'''. Зная структуру XPM-файла, его несложно создать, и ещё проще — редактировать в произвольном текстовом редакторе.
Line 29: Line 81:
=== Что в итоге ===
Line 33: Line 85:
  * Правда, броузеры его показывать отказываются :(

XPM: растровое изображение своими руками

Возьмём какую-нибудь тему из школьной информатики. Например, изучение растровой графики.

О чём по этой теме стоит разговаривать?

  • О матричном представлении изображения, в том числе — о том, что одной только матрицы недостаточно: размеры, способ кодирования цвета, другая дополнительная информация
  • О кодировании цветов и цветовых пространствах (как минимум — RGB, CMYK и HLS/HLV)
  • Об упаковке изображения и об упаковке «с потерями»
  • О проблемах геометрических преобразований

Ставить точки руками или обрабатывать области магией?

Среди этих тем некоторые — явно выше того, что можно в школе объяснить до конца (та же упаковка с потерями, например). Некоторые темы можно осветить только поверхностно. Можно запустить любой приличный редактор растровой графики и показать диалог выбора цвета в различных цветовых пространствах — какой при изменении параметров получается в результате цвет. Однако объяснять, почему цветовые пространства именно такие, придётся всё равно «на пальцах» (колбочки, палочки, складывание цветов, вычитание, а на освещённости/светлоте начинается уже математика).

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

А вот теме «матричное представление изображения», как это ни странно, не хватает программной наглядности. С одной стороны, имеется растровый редактор, в котором всё вполне наглядно, своими руками делается. А с другой стороны, со стороны программиста — разнообразные прекрасные библиотеки для работы с разнообразными прекрасными растровыми форматами.

И вот эта пропасть слабо преодолима. Потому что библиотеки, в конечном счёте, описывают совсем не то, что человек делает в простейшем растровом редакторе, а если описывают, то в очень общем, действительно сложном изводе. Для короткого, но познавательного изучения растровых форматов на занятиях по программированию большинство библиотек непригодны — получится изучение самих библиотек.

Байты и договоренности

Чего не хватает — это наглядного представления изображения в виде двумерного массива байтов и сопутствующей информации. Например, в «проекте рисования графика» мы использовал для этой цели… двумерный массив байтов! Более точно — массив строк, каждый символ которых соответствует отдельной точке «экрана». Обновление такого «экрана» — просто вывод всех строк на текстовый терминал.

Довольно интересный компромисс в этом плане — формат X Pixmap.

Вот, например, маленькая картинка в формате xpm: rbomb.png А вот тот же самый файл непосредственно:

   1 /* XPM */
   2 static char * rbomb_xpm[] = {
   3 /* width height ncolors chars_per_pixel */
   4 "32 32 5 1",
   5 /* colors */
   6 "       s None  c None",
   7 "o      c gray50",
   8 "O      c black",
   9 "$      c red",
  10 "%      c #B0B0B0",
  11 /* pixels */
  12 "                                ",
  13 "                                ",
  14 "                                ",
  15 "                                ",
  16 "                                ",
  17 "                                ",
  18 "                                ",
  19 "                                ",
  20 "           oOoOo                ",
  21 "          O     Oo              ",
  22 "         o        O             ",
  23 "         O        o             ",
  24 "       OOOOO       O            ",
  25 "       OOOOO       o            ",
  26 "      OOOOOOO       O           ",
  27 "    oOOOOOOOOOo     o  $       $",
  28 "   oOOOOOOOOOOOo    O      $  $ ",
  29 "  oOOOOOOOOOOOOOo    o  $       ",
  30 "  OOOOOOOO%ooOOOO    O   $  $   ",
  31 " oOOOOOOOOO%ooOOOo    o   $ $   ",
  32 " OOOOOOOOOOOOOOOOO     OoO $ $ $",
  33 " OOOOOOOOOOO%ooOOO        $$    ",
  34 " OOOOOOOOOOO%ooOOO      $   $   ",
  35 " OOOOOOOOOOO%ooOOO        $  $  ",
  36 " OOOOOOOOOOOOOOOOO     $        ",
  37 " oOOOOOOOOOOOOOOOo    $   $    $",
  38 "  OOOOOOOOOOOOOOO               ",
  39 "  oOOOOOOOOOOOOOo         $     ",
  40 "   oOOOOOOOOOOOo                ",
  41 "    oOOOOOOOOOo                 ",
  42 "      oOOOOOo                   ",
  43 "                                "};

То есть сам формат — строго текстовый. Зная структуру XPM-файла, его несложно создать, и ещё проще — редактировать в произвольном текстовом редакторе.

TODO X Pixmap

Что в итоге

При всё своей «игрушечности» формат XPM:

  • На самом деле никакой не игрушечный
  • Долгое время был чуть ли не де-факто стандартом на маленькие изображения в графической системе X.org
    • Правда, броузеры его показывать отказываются :(

  • Позволяет сразу зацепить несколько тем:
    • Растр как матрица точек + дополнительная информация

    • Представление цветов в пространстве RGB и именование
    • Палитрованое изображение
    • Абстракции «прозрачность», «цвет фона», «цвет рисования»
    • Работа с точками растра при преобразовании
  • Неплохо подходит для изучения в курсе программирования на Си :)

FrBrGeorge/LearnXPM (last edited 2019-03-15 11:55:56 by FrBrGeorge)