Вход/Регистрация
Программирование в X Window средствами Free Pascal
вернуться

Семериков С. А.

Шрифт:

Один из способов загрузки битового изображение из файла в память - включение файла побитового изображения в программу директивой #include препроцессора языка С.

Покажем, как можно получить доступ к файлу непосредственно:

var

 (* эта переменная будет содержать дескриптор новой пиксельной карты *)

 bitmap: TPixmap;

 (* эти переменные будут содержать размер загружаемой битовой карты *)

 bitmap_width, bitmap_height: word;

 (* эти переменные будут содержать положение горячей точки загружаемой битовой карты *)

 hotspot_x, hotspot_y: integer;

 (* эта переменная будет содержать дескриптор корневого окна экрана, для которого мы хотим создать пиксельную карту *)

 root_win: TWindow;

 rc: longint;

 root_win:= XDefaultRootWindow(display);

(* загружаем битовую карту из файла "icon.bmp", создаем пиксельную карту, содержащую свои данные в сервере, и сохраняем ее дескриптор в переменной bitmap *)

 rc:= XReadBitmapFile(display, root_win, 'icon.bmp', @bitmap_width, @bitmap_height, @bitmap, @hotspot_x, @hotspot_y);

 (* проверяем, удалось ли создать пиксельную карту *)

 case (rc) of

 BitmapOpenFailed:

writeln('XReadBitmapFile - не могу открыть файл "icon.bmp"');

 BitmapFileInvalid:

writeln('XReadBitmapFile - файл "icon.bmp" не содержит корректного битового изображения.');

 BitmapNoMemory:

writeln('XReadBitmapFile - не хватает памяти.');

 BitmapSuccess:

(* битовая карта успешно загружена - что-то делаем с ней… *)

.

.

end;

Имейте в виду, что параметр root_win не имеет ничего общего с данным битовым изображением - битовая карта не связывается с этим окном. Этот дескриптор окна использован только для определения экрана, для которого мы хотим создать пиксельную карту. Это существенно, так как для того, чтобы быть полезной, пиксельная карта должна поддерживать то же количество цветов, что и экран.

Как только мы получили дескриптор пиксельной карты, сгенерированный из битового изображения, мы можем нарисовать ее в некотором окне, используя функцию XCopyPlane. Эта функция позволяет указать, в какой рисуемой области (окне, или даже другой пиксельной карте) и в какой позиции будет отображена данная пиксельная карта.

(* Рисовать ранее загруженную битовую карту в заданном окне, в позиции x=100, y=50. Мы хотим скопировать всю битовую карту, поэтому указываем координаты x=0, y=0 для копирования с начала битового изображения и его полный размер *)

XCopyPlane(display, bitmap, win, gc, 0, 0, bitmap_width, bitmap_height, 100, 50, 1);

Мы могли также скопировать заданный прямоугольный фрагмент пиксельной карты вместо полного ее копирования. Последний параметр в функции XCopyPlane определяет, какой слой (цветовую плоскость) исходного изображения мы хотим скопировать в целевое окно. Для битовых изображений всегда копируется плоскость номер 1.

Часто бывает необходимо создать неинициализированную пиксельную карту, чтобы в дальнейшем в ней можно было рисовать. Это полезно для графических редакторов (создание нового пустого "холста" вызовет создание новой пиксельной карты, в которой будет храниться изображение). Это полезно при чтении различных форматов изображений - мы загружаем графические данные в память, создаем на сервере пиксельную карту, а затем рисуем расшифрованные графические данные на этой пиксельной карте.

var

 (* эта переменная будет содержать дескриптор новой пиксельной карты *)

 pixmap: TPixmap;

 (* эта переменная будет содержать дескриптор корневого окна экрана, для которого мы хотим создать пиксельную карту *)

 root_win: TWindow;

 (* эта переменная будет содержать глубину цвета создаваемой пиксельной карты - количество бит, используемых для представления индекса цвета в палитре (количество цветов равно степени двойки глубины) *)

  • Читать дальше
  • 1
  • ...
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: