2015-08-21 5 views
1

У меня есть альфа-преумтированное изображение, которое требует изменения непрозрачности. Изменение непрозрачности, применяемое к изображению, может быть от 0.0 до 1.0.Как изменить прозрачность альфа-премультиплексированного изображения?

Этот процесс легко достичь с помощью следующей формулы:

Cn = C*alpha; 
An = A*alpha; 

Однако, я пытаюсь не писать этот код мой сам и позволяет оптимизированная библиотека pixman сделать работу. Они предоставляют различные варианты смешивания, но я не слишком уверен, как использовать маску или какую смесь использовать. Я пробовал использовать MULTIPLY, но это только что сделало изображение темнее, как ожидалось, я думаю ...

Любые идеи, которые могут использоваться в качестве возможного варианта смешивания?

{ "CLEAR",  PIXMAN_OP_CLEAR }, 
    { "SRC",  PIXMAN_OP_SRC }, 
    { "DST",  PIXMAN_OP_DST }, 
    { "OVER",  PIXMAN_OP_OVER }, 
    { "OVER_REVERSE", PIXMAN_OP_OVER_REVERSE }, 
    { "IN",  PIXMAN_OP_IN }, 
    { "IN_REVERSE", PIXMAN_OP_IN_REVERSE }, 
    { "OUT",  PIXMAN_OP_OUT }, 
    { "OUT_REVERSE", PIXMAN_OP_OUT_REVERSE }, 
    { "ATOP",  PIXMAN_OP_ATOP }, 
    { "ATOP_REVERSE", PIXMAN_OP_ATOP_REVERSE }, 
    { "XOR",  PIXMAN_OP_XOR }, 
    { "ADD",  PIXMAN_OP_ADD }, 
    { "SATURATE", PIXMAN_OP_SATURATE }, 

    { "MULTIPLY", PIXMAN_OP_MULTIPLY }, 
    { "SCREEN",  PIXMAN_OP_SCREEN }, 
    { "OVERLAY", PIXMAN_OP_OVERLAY }, 
    { "DARKEN",  PIXMAN_OP_DARKEN }, 
    { "LIGHTEN", PIXMAN_OP_LIGHTEN }, 
    { "COLOR_DODGE", PIXMAN_OP_COLOR_DODGE }, 
    { "COLOR_BURN", PIXMAN_OP_COLOR_BURN }, 
    { "HARD_LIGHT", PIXMAN_OP_HARD_LIGHT }, 
    { "SOFT_LIGHT", PIXMAN_OP_SOFT_LIGHT }, 
    { "DIFFERENCE", PIXMAN_OP_DIFFERENCE }, 
    { "EXCLUSION", PIXMAN_OP_EXCLUSION }, 
    { "HSL_HUE", PIXMAN_OP_HSL_HUE }, 
    { "HSL_SATURATION", PIXMAN_OP_HSL_SATURATION }, 
    { "HSL_COLOR", PIXMAN_OP_HSL_COLOR }, 
    { "HSL_LUMINOSITY", PIXMAN_OP_HSL_LUMINOSITY }, 

Это фактическая функция композит:

void pixman_image_composite(pixman_op_t  op, 
          pixman_image_t *src, 
          pixman_image_t *mask, 
          pixman_image_t *dest, 
          int16_t   src_x, 
          int16_t   src_y, 
          int16_t   mask_x, 
          int16_t   mask_y, 
          int16_t   dest_x, 
          int16_t   dest_y, 
          uint16_t   width, 
          uint16_t   height); 

ответ

0

Решение было на самом деле довольно легко. Вначале я не слишком много думал о маске. Тогда я понял, что маска, конечно же, как и использование фотошоп.

Таким образом, применение маски с правильным значением альфа приведет к изменению ее непрозрачности.

Чтобы изменить непрозрачность изображения на 50%, мы будем использовать маску с белым цветом и значением альфа на 50%.

Смежные вопросы