C++ 读取透明图像boost.gil C++;

C++ 读取透明图像boost.gil C++;,c++,boost,boost-gil,C++,Boost,Boost Gil,我有一个带有透明背景的图像,我想将它复制到另一个图像上。这两个图像都是png格式,我尝试过使用boost::gil::rgba8_image_t,但它仍然复制带有灰色背景的透明图像。 这就是我用过的 #包括 #包括 #包括 #包括 #包括 名称空间bg=boost::gil; int main(){ 字符串目标{.../jail.png}; std::字符串图片(“./example_in.png”); 背景:rgba8_图像_t监狱; bg::rgba8_图像_t温度; bg::read_和c

我有一个带有透明背景的图像,我想将它复制到另一个图像上。这两个图像都是png格式,我尝试过使用boost::gil::rgba8_image_t,但它仍然复制带有灰色背景的透明图像。 这就是我用过的

#包括
#包括
#包括
#包括
#包括
名称空间bg=boost::gil;
int main(){
字符串目标{.../jail.png};
std::字符串图片(“./example_in.png”);
背景:rgba8_图像_t监狱;
bg::rgba8_图像_t温度;
bg::read_和convert_图像(target、jail、bg::png_标记{});
bg::rgba8_image_t pic(jail.dimensions());
bg::read_和convert_图像(图片、临时、bg::png_标记{});
bg::resize_视图(bg::view(temp)、bg::view(pic)、bg::bilinear_采样器{});
bg::copy_像素(bg::view(监狱),bg::view(pic));
bg::write_视图(“out.png”,bg::view(pic),bg::png_标记{});
}

Mmm。读到这篇文章,它似乎完全按照你的要求去做:

bg::resize_view(bg::view(temp), bg::view(pic), bg::bilinear_sampler{});
这将使用输入图像的大小调整视图填充像素。新的尺寸和你的监狱完全吻合。现在:

bg::resize_view(bg::view(temp), bg::view(pic), bg::bilinear_sampler{});
图像中的所有像素复制到其上。这将替换刚从调整大小的输入图像填充的任何像素

您的输出看起来像

请注意背景是如何交错的。这是表示透明度的常规模式。那不是灰色的。它只是完全透明的空像素

你大概想要的是保留背景像素。Boost GIL中似乎没有高级像素操作,但您自己编写:

using Img = bg::rgba8_image_t;
using Pix = Img::value_type;

void overlay_combine(Img& pic, Img const& overlay) {
    assert(pic.dimensions() == overlay.dimensions());
    bg::transform_pixels(
        view(pic), const_view(overlay), view(pic),
        [](Pix const& a, Pix const& b) {
            return get_color(b, bg::alpha_t{})? b : a;
        });
}
现在编写
main
如下:

int main() {
    Img jail, polar;
    bg::read_and_convert_image("./jail_PNG16.png", jail, bg::png_tag{});
    bg::read_and_convert_image("./polar.png", polar, bg::png_tag{});

    Img pic(jail.dimensions());
    bg::resize_view(bg::view(polar), bg::view(pic), bg::bilinear_sampler{});
    overlay_combine(pic, jail);

    bg::write_view("out.png", bg::view(pic), bg::png_tag{});
}
结果是:

你可以猜到我从哪里得到的
polar.png
:)


例如,请参阅。

让我想起了这一点。奇怪的是,当时我一直无法用boost 1.74/1.75复制它。你有png输入,这样我们可以尝试复制吗?这是“jail.png”