gpt4 book ai didi

c - Pixman 合成与 Alpha 混合

转载 作者:行者123 更新时间:2023-12-02 10:58:38 26 4
gpt4 key购买 nike

下面是一个小型测试程序(适用于小端机器)。

事实上,结果对我来说已经很奇怪了:

 in: r=20 g=20 b=80 a=FF (#202080FF, ok!)
out: r=90 g=90 b=C0 a=FF (#9090C0FF, strange...)

正如我所期望的,填充颜色 #FFFFFFFF x 掩码 0x80 = #FFFFFF80,因此输出为 #9090FFFF...

现在,如果我通过更改“cfill.alpha = uint16_t(0x80) << 8;”将填充颜色设置为#FFFFFF80 ,结果看起来确实错误:

in: r=20 g=20 b=80 a=FF
out: r=98 g=98 b=E0 a=FF

我希望填充 x mask => #FFFFFF40,因此输出为:#606060C0FF。

我尤其不明白较低的 alpha 输入颜色如何最终在目标图像上产生较亮的输出。

我在这里做错了什么?是否有另一个 PIXMAP_OP_xxx 可以按我的预期工作?

谢谢。

#include <stdlib.h>
#include <stdio.h>
#include "pixman.h"

union C {
uint32_t value;
struct RGBA8888 {
uint8_t a;
uint8_t b;
uint8_t g;
uint8_t r;
} rgba;
};

int main()
{
// create target image full with r=0x20 g=0x20 b=0x80 a=0xFF
size_t w = 100; // multiple of 4 for alignment
size_t h = 100;
C *target = (C*)malloc(w * h * sizeof(C));
for(size_t i = 0; i < w * h; ++i)
target[i].value = 0x202080FF;
printf("in: r=%02X g=%02X b=%02X a=%02X\n",
target[0].rgba.r, target[0].rgba.g, target[0].rgba.b, target[0].rgba.a);

// connect target to pixman image
pixman_image_t *ptarget = pixman_image_create_bits(PIXMAN_r8g8b8a8, w, h, (uint32_t*)target, w * sizeof(uint32_t));

// create fill
pixman_color_t cfill;
cfill.red = uint16_t(0xFF) << 8;
cfill.green = uint16_t(0xFF) << 8;
cfill.blue = uint16_t(0xFF) << 8;
cfill.alpha = uint16_t(0xFF) << 8;
pixman_image_t *pfill = pixman_image_create_solid_fill(&cfill);

// create mask with a=0x80
uint8_t *mask = (uint8_t*)malloc(w * h);
for(size_t i = 0; i < w * h; ++i)
mask[i] = 0x80;
pixman_image_t *pmask = pixman_image_create_bits(PIXMAN_a8, w, h, (uint32_t*)mask, w);

// do compositing
pixman_image_composite(
PIXMAN_OP_OVER,
pfill, pmask, ptarget,
// src_x, src_y
0, 0,
// mask_x, mask_y
0, 0,
// dest_x, dest_y, width, height
0, 0, w, h);

// display one pixel of target
printf("out: r=%02X g=%02X b=%02X a=%02X\n",
target[0].rgba.r, target[0].rgba.g, target[0].rgba.b, target[0].rgba.a);
}

最佳答案

我发现 Pixman 可以与预乘 alpha 一起使用!因此带有 alpha 的白色应该是#80808080,然后是#40404040,而不是#FFFFFF80 和#FFFFFF40。

希望对其他人有帮助;)

关于c - Pixman 合成与 Alpha 混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24172540/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com