XImage

Материал из Циклопедии
Перейти к навигации Перейти к поиску

XImage — это механизм манипуляции с изображением и сохранения изображения клиентской части оконной системы X Window. X Image может быть описана как битовый массив, хранящий изображение следующим образом на языке C:

<source lang='c'>

typedef struct XImage XImage;
struct XImage {
  int width, height;		/* size of image */
  int xoffset;			/* number of pixels offset in X direction */
  int format;			/* XYBitmap, XYPixmap, ZPixmap */
  char *data;			/* pointer to image data */
  int byte_order;		/* data byte order, LSBFirst, MSBFirst */
  int bitmap_unit;		/* quant. of scanline 8, 16, 32 */
  int bitmap_bit_order;		/* LSBFirst, MSBFirst */
  int bitmap_pad;		/* 8, 16, 32 either XY or ZPixmap */
  int depth;			/* depth of image */
  int bytes_per_line;		/* accelerator to next scanline */
  int bits_per_pixel;		/* bits per pixel (ZPixmap) */
  unsigned long red_mask;	/* bits in z arrangement */
  unsigned long green_mask;
  unsigned long blue_mask;
  XPointer obdata;		/* hook for the object routines to hang on */
  struct funcs {		/* image manipulation routines */
    XImage *(*create_image)();
    int (*destroy_image)();
    unsigned long (*get_pixel)();
    int (*put_pixel)();
    XImage *(*sub_image)();
    int (*add_pixel)();
  } f;
};

</source>

Описание структуры XImage[править]

  1. Поля width и height хранят размер изображения.
  2. Поле xoffset хранит количество точек от начала строки изображения, которые будут игнорироваться при выводе.
  3. Поле format указывает на формат данных изображения. XYBitmap подразумевает монохромное изображение, XYPixmap хранит индексы из цветовой палитры, а ZPixmap позволяет работать с полноцветным изображением.
  4. Поле data хранит указатель на массив данных изображения.
  5. Поле byte_order указывает порядок расположения байтов в массиве данных при формировании многобайтовых значений. Может принимать значения (LSBFirst - младший байт первый или MSBFirst - старший байт первый). Это поле должно соответствовать порядку байт рабочей машины.
  6. Поле bitmap_unit указывает количество разрядов, используемых для хранения одного пиксела изображения. (8, 16 или 32 бита)
  7. Поле bitmap_bit_order указывает на порядок расположения разрядов в байтах массива данных изображения относительно увеличения координаты x. Для ZPixmap всегда MSBFirst.
  8. Поле bitmap_pad является параметром выравнивания адреса начала строки изображения (8, 16 или 32 бита). К примеру, если установлено значение 8, то строка изображения может начинаться с произвольного адреса, а если установлено значение 16, то строки будут начинаться только с чётных адресов. Это сделано с возможностью предоставления оптимизации скорости для систем с повышенной разрядностью, поскольку выборка многобайтовых значений с адресов, кратных разрядности шины данных системы производится быстрее.
  9. Поле depth указывает глубину цветности изображения 8, 15, 16, 24 или 32.
  10. Поле bytes_per_line указывает на количество байт, отводимых на одну строку изображения. Используется для вычисления адреса следующей строки.
  11. Поле bits_per_pixel указывает на количество разрядов, отводимых для одного пиксела изображения. Используется только для формата изображения ZPixmap.
  12. Поля red_mask, green_mask и blue_mask указывают, какие разряды, используемые при кодировании пикселя хранят значения яркости красной, зелёной и синей составляющих цвета. Используются только для формата изображения ZPixmap
  13. Остальные поля связаны с указателями на функции, которые рассчитаны на работу с описываемым изображением.

Пример программы[править]

Ниже приведен пример программы на языке C, выводящий изображение XImage в окно X Window.

<source lang='cpp'> /* Компилируется строкой: cc -o test test.c -I/usr/X11R6/include -I/usr/X11R6/include/X11 -L/usr/X11R6/lib -lX11 -lm */

  1. include <X11/Xlib.h>
  2. include <X11/Xutil.h>
  3. include <X11/Xatom.h>
  4. include <X11/keysym.h>
  5. include <stdlib.h>
  6. include <stdio.h>
  7. include <errno.h>


main(int argc, char *argv[]) {

   Display *dis;
   Window win;	/* окно */
   XEvent event;/* События */
   GC gc;/* Графический контекст */
   int depth, screen;
   Visual *vis;
   XImage *image;
   int n, width = 320, height = 240, size;
   char *buf;
   Bool terminate = False;


   if ((dis = XOpenDisplay(getenv("DISPLAY"))) == NULL) {

printf("Can't connect X server: %s\n", strerror(errno)); exit(1);

   }


   screen = DefaultScreen(dis);
   depth = DefaultDepth(dis, screen);
   vis = DefaultVisual(dis, screen);
   win = XCreateSimpleWindow(dis, RootWindow(dis, DefaultScreen(dis)),

0, 0, width, height, 5, BlackPixel(dis, DefaultScreen(dis)), WhitePixel(dis, DefaultScreen(dis)));

   XSetStandardProperties(dis, win, "Test XImage", argv[0], None, argv, argc, NULL);
   gc = DefaultGC(dis, DefaultScreen(dis));
   /* Выделяем память для рисунка */
   size = width * height * 4;
   buf = malloc(size);
   if (buf == NULL) {

perror("malloc"); exit(-2);

   }
   /* Заполним случайными данными */
   for (n = 0; n < size; n++)
    buf[n] = rand();
   /* Создаем XImage размером width * height */
  image =  XCreateImage(dis, CopyFromParent, depth, ZPixmap, 0, buf, width, height, 32, 0);
   XMapWindow(dis, win);
   XSelectInput(dis, win, ExposureMask | KeyPressMask);
   while (!terminate) {

XNextEvent(dis, &event); if (event.xany.window == win) { switch (event.type) { case Expose: XPutImage(dis, win, gc, image, 0, 0, 0, 0, image->width, image->height); break;

case KeyPress: if (XLookupKeysym(&event.xkey, 0) == XK_q) terminate = True; break;

default: break; } }

   }
   XDestroyImage(image);
   XCloseDisplay(dis);
   exit(EXIT_SUCCESS);

} </source>

Примечания[править]

Ссылки[править]

 
Архитектура

Основной протокол Xlib Выделение Менеджер сессий XDM Инструментарий Авторизация Встроенные средства Список цветов

Менеджеры окон

Композитный Репарентинг Тайлинг

Расширения

Графическое Клавиатурное Общей памяти X video Контурное GLX XRender

Реализации

X11.app X.Org Server X-Win32 XFree86 XDarwin Xming Xsun

Стандарты

ICCCM freedesktop.org

Приложения

xcalc xclock xedit xload xterm xeyes