Изменение альфа-значения пикселей на основе значения цвета HSV в окне Xlib - PullRequest
0 голосов
/ 27 августа 2018

Это может быть немного запутанным, пожалуйста, спросите, нужно ли больше разъяснений.Итак, у меня есть окно X11, созданное так: (https://github.com/Aaahh/xwinwrap/blob/master/xwinwrap.c для полного файла)

    XSetWindowAttributes attrs = {ParentRelative,
                              0L,
                              0,
                              0L,
                              0,
                              0,
                              Always,
                              0L,
                              0L,
                              False,
                              StructureNotifyMask | ExposureMask,
                              0L,
                              True,
                              0,
                              0};

if (have_argb_visual) {
  attrs.colormap = window.colourmap;
  attrs.border_pixel = 0;
  attrs.background_pixel = 0x80ffffff;
  flags |= CWBorderPixel | CWColormap | CWBackPixel;
} else {
  flags |= CWBackPixel;
}

window.window = XCreateWindow(display, window.root, window.x, window.y,
                              window.width, window.height, 0, depth,
                              InputOutput, visual, flags, &attrs);

и

XVisualInfo visual_template;
XVisualInfo *visual_list;
int nxvisuals = 0, i;

visual_template.screen = screen;
visual_list =
    XGetVisualInfo(display, VisualScreenMask, &visual_template, &nxvisuals);
for (i = 0; i < nxvisuals; i++) {
  if (visual_list[i].depth == 32 && (visual_list[i].red_mask == 0xff0000 &&
                                   visual_list[i].green_mask == 0x00ff00 &&
                                   visual_list[i].blue_mask == 0x0000ff)) {
  *visual = visual_list[i].visual;
  *depth = visual_list[i].depth;
  if (debug)
    fprintf(stderr, "Found ARGB Visual\n");
  XFree(visual_list);
  return 1;
}
}

, так что это работает, когда прозрачные пиксели отображаютсяокно (с помощью программы, передающей окно с помощью идентификатора окна) (например, / usr / lib / xscreensaver / glmatx -window-id WID).

Основная проблема, с которой я сталкиваюсь, заключается в том, что в программах отсутствует одинаковая глубина цвета (поэтому все альфа установлены на 0). Я хочу заменить альфа с 0 на «значение» цвета в формате HSV.или, если проще, замените все черные пиксели на альфа 1. Идея в том, что я хочу смешать с argb, воссоздав эту ошибку: https://github.com/brndnmtthws/conky/pull/84

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

enter image description here enter image description here enter image description hereenter image description here enter image description here enter image description here

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

...