КТвП    

  Задание на практику ~ 
  Доступ к осциллографу ~ 
  Проверка доступа ~ 
  Язык SCPI ~ 
  Справка по gnuplot ~ 
  Справка по GD ~ 
  Справка по Xlib ~ 
  Справка по SDL ~ 
/Студентам/КТвП/Справка по GD

Введение

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.

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

[picture, GD output example]

Файл со шрифтом ("FreeSerif.ttf") должен находиться в текущем каталоге программы.

Дата последней модификации: 2013-12-13


/Студентам/КТвП/Справка по GD

Содержимое данного сайта может быть использовано кем угодно, когда угодно, как угодно и для каких угодно целей. Автор сайта не несёт абсолютно никакой ответственности за землетрясения, наводнения, финансовые кризисы, глобальные потепления/похолодания, разбитые тарелки, зуд/онемение в левой/правой пятке читателя, эпидемии/пандемии свинячьего/птичьего/тараканьего и иных гриппов, а также за прочие негативные, равно как и позитивные, последствия, вызванные прямым или косвенным использованием материалов данного сайта кем бы то ни было, включая самого автора. При копировании/цитировании материалов данного сайта любым технически возможным в настоящее время способом, а также способом, могущим стать возможным в будущем, указание (либо неуказание) ссылки на первоисточник лежит, блин, тяжким грузом на совести копирующего/цитирующего.

Valid HTML 4.0 Strict Valid CSS!