C++ 读取透明图像boost.gil C++;
我有一个带有透明背景的图像,我想将它复制到另一个图像上。这两个图像都是png格式,我尝试过使用boost::gil::rgba8_image_t,但它仍然复制带有灰色背景的透明图像。 这就是我用过的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
#包括
#包括
#包括
#包括
#包括
名称空间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”