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[править]
- Поля
widthиheightхранят размер изображения. - Поле
xoffsetхранит количество точек от начала строки изображения, которые будут игнорироваться при выводе. - Поле
formatуказывает на формат данных изображения.XYBitmapподразумевает монохромное изображение,XYPixmapхранит индексы из цветовой палитры, аZPixmapпозволяет работать с полноцветным изображением. - Поле
dataхранит указатель на массив данных изображения. - Поле
byte_orderуказывает порядок расположения байтов в массиве данных при формировании многобайтовых значений. Может принимать значения (LSBFirst- младший байт первый илиMSBFirst- старший байт первый). Это поле должно соответствовать порядку байт рабочей машины. - Поле
bitmap_unitуказывает количество разрядов, используемых для хранения одного пиксела изображения. (8, 16 или 32 бита) - Поле
bitmap_bit_orderуказывает на порядок расположения разрядов в байтах массива данных изображения относительно увеличения координаты x. ДляZPixmapвсегдаMSBFirst. - Поле
bitmap_padявляется параметром выравнивания адреса начала строки изображения (8, 16 или 32 бита). К примеру, если установлено значение 8, то строка изображения может начинаться с произвольного адреса, а если установлено значение 16, то строки будут начинаться только с чётных адресов. Это сделано с возможностью предоставления оптимизации скорости для систем с повышенной разрядностью, поскольку выборка многобайтовых значений с адресов, кратных разрядности шины данных системы производится быстрее. - Поле
depthуказывает глубину цветности изображения 8, 15, 16, 24 или 32. - Поле
bytes_per_lineуказывает на количество байт, отводимых на одну строку изображения. Используется для вычисления адреса следующей строки. - Поле
bits_per_pixelуказывает на количество разрядов, отводимых для одного пиксела изображения. Используется только для формата изображенияZPixmap. - Поля
red_mask,green_maskиblue_maskуказывают, какие разряды, используемые при кодировании пикселя хранят значения яркости красной, зелёной и синей составляющих цвета. Используются только для формата изображенияZPixmap - Остальные поля связаны с указателями на функции, которые рассчитаны на работу с описываемым изображением.
Пример программы[править]
Ниже приведен пример программы на языке 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 */
- include <X11/Xlib.h>
- include <X11/Xutil.h>
- include <X11/Xatom.h>
- include <X11/keysym.h>
- include <stdlib.h>
- include <stdio.h>
- 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>
Примечания[править]
Ссылки[править]
- [1],[X Consortium]
- Графические системы Linux-а с точки зрения игр и мультимедиа, Сергей Кононенко, 2000
↑ | |
|---|---|
| Архитектура |
Основной протокол • Xlib • Выделение • Менеджер сессий • XDM • Инструментарий • Авторизация • Встроенные средства • Список цветов |
| Менеджеры окон | |
| Расширения |
Графическое • Клавиатурное • Общей памяти • X video • Контурное • GLX • XRender |
| Реализации |
X11.app • X.Org Server • X-Win32 • XFree86 • XDarwin • Xming • Xsun |
| Стандарты | |
| Приложения | |