GD - это библиотека для создания изображений; при этом надо иметь ввиду, что это библиотека НЕ для рисования на ЭКРАНЕ. Изображение создается в оперативной памяти компьютера и затем его можно записать в файл в различных форматах, в частности, PNG и JPEG.
В состав библиотеки входят функции для загрузки и записи изображений, функции для рисования графических примитивов (отрезки, дуги и т.п.) и текста, функции для работы с цветами и пр. Для использования библиотеки в программе на языке программирования С нужно включить заголовочный файл gd.h и при компиляции указать ключ -lgd.
Чтобы использовать функции вывода текста, нужно еще подключить заголовочные файлы gdfontt.h, gdfonts.h, gdfontmb.h, gdfontl.h, gdfontg.h. Эти заголовочные файлы содержат описания встроенных в GD шрифтов (крошечного (gdFontTiny), маленького (gdFontSmall), среднего жирного (gdFontMediumBold), большого (gdFontLarge) и гигантского (gdFontGiant), соответственно). Отметим, что шрифты, встроенные в GD, не содержат символов из национальных алфавитов, в частности, символов кириллицы. Как выводить строчки с использованием шрифтов TrueType, показано в примере программы в конце данного текста.
Полное руководство по библиотеке GD обычно находится в файле
/usr/share/doc/libgd2-noxpm/README.html
или
/usr/share/doc/libgd2/README.html
или в каком-то подобном (просто посмотрите в каталог /usr/share/doc/ в Вашей системе).
Координатная система, используемая в GD, подразумевает, что левый верхний угол изображения имеет координаты {х=0,y=0}, то есть ось X направлена из этого угла по горизонтали вправо, а ось Y - по вертикали вниз.
Для создания "пустого" изображения используется функция gdImageCreate():
gdImagePtr gdImageCreate(int sx, int sy);
Функция имеет два параметра, которые задают ширину и высоту создаваемого изображения в пикселах и возвращает указатель на изображение, определённый в GD как gdImagePtr. Подробности смотрите в файле gd.h. Следует отметить, что данная функция создает изображение с числом цветов не более 256. Если нужно создать изображение с большим количеством цветов, следует использовать функцию gdImageCreateTrueColor:
gdImagePtr gdImageCreateTrueColor(int sx, int sy);
Для загрузки уже существующего изображения из файла используется семейство функций:
gdImagePtr gdImageCreateFromPng(FILE * infile); gdImagePtr gdImageCreateFromWBMP(FILE * infile); gdImagePtr gdImageCreateFromJpeg (FILE * infile); ...
Из названий ясно, что, например, вторая из перечисленных функций предназначена для загрузки изображений в формате Windows BitMap. Обратите внимание, что все эти функции в качестве параметра требуют уже открытый для чтения файл с изображением:
..... gdImagePtr im; FILE *in; FILE *out; in = fopen("some_jpeg_image.jpg", "rb"); im = gdImageCreateFromJpeg(in); fclose(in); /* подрисовываем усики */ /* сохраняем в формате PNG*/ out = fopen("new_file.png", "wb"); gdImagePng(im, out); fclose(out); gdImageDestroy(im); ...
В приведенном отрывке кода показано, что после использования изображения нужно освободить память, для чего предназначена функция gdImageDestroy(im). Единственный параметр этой функции представляет собой указатель на удаляемое изображение. Вообще, все функции в библиотеке GD, как правило, первым параметром имеют указатель на изображение. Кроме того, этот отрывок демонстрирует запись изображения в файл. В данном случае изображение сохраняется в формате PNG. Для сохранения в других форматах имеются соответствующие функции, то есть gdImageJpeg(), gdImageWBMP() и т.п., с аналогичным параметрами. При этом второй параметр задает предварительно открытый для записи файл.
Каждому изображению, с которым работает программа, ставится в соответствие палитра цветов. Если изображение загружается из файла, то в палитру вносятся те цвета, которые были использованы при создании этого изображения (если, конечно, формат файла предусматривает возможность хранения палитры). Если же изображение создается с "нуля", то сразу после его создания палитра этого изображения не содержит ни одного цвета.
Для добавления цветов в палитру изображения используется функция
int gdImageColorAllocate( gdImagePtr im, int r, int g, int b )
Первый параметр данной функции - это, собственно, изображение, в палитру которого добавляется цвет, а следующие 3 параметра задают компоненты цвета в системе цветовых координат RGB. При успешном завершении функция возвращает индекс добавленного в палитру цвета. Если же произошла ошибка (например, палитра полностью заполнена), возвращается -1.
Для удаления цвета из палитры используется функция
void gdImageColorDeallocate(gdImagePtr im, int color)
Первый параметр задает изображение, из палитры которого удаляется цвет, а второй - индекс цвета в этой палитре.
Поскольку, как уже упоминалось, каждому изображению соответствует своя палитра, то в нижеприведенном примере цвет строчки "This text is GREEN" на втором изображении окажется неправильным:
Обе строчки на втором изображении будут нарисованы синим цветом, поскольку индекс цвета 'green' (==1) для ВТОРОГО изображения указывает на первый элемент палитры, а в нем у второго изображения описан синий цвет, а не зеленый.
Ниже приведены прототипы некоторых функций для рисования графических примитивов:
void gdImageSetPixel( gdImagePtr im, int x, int y, int color ); void gdImageLine( gdImagePtr im, int x1, int y1, int x2, int y2, int color ); void gdImageDashedLine( gdImagePtr im, int x1, int y1, int x2, int y2, int color ); void gdImageRectangle( gdImagePtr im, int x1, int y1, int x2, int y2, int color ); void gdImageFilledRectangle( gdImagePtr im, int x1, int y1, int x2, int y2, int color ); void gdImageArc( gdImagePtr im, int cx, int cy, int w, int h, int s, int e, int color );
Первая из приведенных функций рисует точку на изображении im (первый параметр) в месте с координатами {x1,y1} (следующие два параметра) цветом color (последний параметр).
Две следующие функции рисуют на изображении im сплошную и штрихованную линию, соответственно. Линия проводится из точки с координатами {x1,y1} в точку с координатами {x2,y2}.
Функции gdImageRectangle() и gdImageFilledRectangle() рисуют, соответственно, прямоугольник и заполненный прямоугольник. Параметры x1 и y1 задают левый верхний угол прямоугольника, а параметры x2 и y2 - правый нижний.
Функция gdImageArc() предназначена для рисования собственно дуг, а также окружностей и эллипсов. Параметры cx и cy задают центр дуги, параметры w и h - ширину и высоту дугообразующего эллипса, а параметры s и e - начальный и конечный углы дуги (в градусах), отсчитываемые от горизонта против часовой стрелки. Полный эллипс получается, если, например, начальный угол s дуги задать равным нулю, а конечный e - 360 градусам. Окружность получается, если при этом еще задать ширину w равной высоте h.
Для вывода текста используются 4 основные функции:
void gdImageChar( gdImagePtr im, gdFontPtr font, int x, int y, int c, int color ); void gdImageCharUp( gdImagePtr im, gdFontPtr font, int x, int y, int c, int color ); void gdImageString( gdImagePtr im, gdFontPtr font, int x, int y, unsigned char *s, int color ); void gdImageStringUp( gdImagePtr im, gdFontPtr font, int x, int y, unsigned char *s, int color )
Первые две из них предназначены для вывода одиночного символа в позиции {x,y} цветом color. Функция gdImageChar() рисует символ обычным образом, а - gdImageCharUp() вертикально. Вторые две предназначены для вывода строки в позиции {x,y} цветом color. Функция gdImageString() рисует строку горизонтально, слева направо, а - gdImageCharUp() вертикально, снизу вверх. В качестве второго параметра у всех функций можно использовать вызов одной из следующих функций:
gdFontPtr gdFontGetSmall(void); gdFontPtr gdFontGetLarge(void); gdFontPtr gdFontGetMediumBold(void); gdFontPtr gdFontGetGiant(void); gdFontPtr gdFontGetTiny(void);
Эти функции возвращают указатель на соответствующий (маленький, большой, средний, гигантский, крошечный) шрифт (встроенный в GD!). Как уже говорилось, встроенные в GD шрифты содержат символы только из набора US ASCII. Как рисовать строчки, состоящие из иных символов, например, символов кириллицы, показано в примере ниже.
Ниже приведен пример программы, использующей бибилиотеку GD (при компиляции не забудьте указать -lgd). Пример демонстрирует создание изображения и запись его в файл, рисование линий различными цветами, вывод текста стандартными шрифтами, а также вывод символов кириллицы с использованием шрифтов формата TTF.
В результате работы этой программы получается вот такая картинка:
Файл со шрифтом ("FreeSerif.ttf") должен находиться в текущем каталоге программы.
Дата последней модификации: 2013-12-13