如何解决读取透明图像 boost.gil C++
我有一个带有透明背景的图像,我想将它复制到另一个图像上,这两个图像都是 png 格式我已经尝试使用 boost::gil::rgba8_image_t 但它仍然复制带有灰色背景的透明图像。 这是我用过的
#include <boost/gil.hpp>
#include <boost/gil/extension/io/png.hpp>
#include <boost/gil/extension/numeric/resample.hpp>
#include <boost/gil/extension/numeric/sampler.hpp>
#include <string>
namespace bg = boost::gil;
int main() {
std::string target{"./jail.png"};
std::string picture("./example_in.png");
bg::rgba8_image_t jail;
bg::rgba8_image_t temp;
bg::read_and_convert_image(target,jail,bg::png_tag{});
bg::rgba8_image_t pic(jail.dimensions());
bg::read_and_convert_image(picture,temp,bg::png_tag{});
bg::resize_view(bg::view(temp),bg::view(pic),bg::bilinear_sampler{});
bg::copy_pixels(bg::view(jail),bg::view(pic));
bg::write_view("out.png",bg::png_tag{});
}
解决方法
嗯。阅读本文似乎完全符合您的要求:
bg::resize_view(bg::view(temp),bg::view(pic),bg::bilinear_sampler{});
这会用输入图像的调整大小视图填充像素。新的大小与您的监狱的大小完全匹配。现在:
bg::resize_view(bg::view(temp),bg::bilinear_sampler{});
将 jail
图像中的所有像素复制到其上。这将替换您刚刚从调整大小的输入图像中填充的任何像素。
你的输出看起来像
注意背景的方格。这是表示透明度的常规模式。那不是灰色。它只是具有完全透明度的空像素。
您大概想要的是保留背景像素。 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::bilinear_sampler{});
overlay_combine(pic,jail);
bg::write_view("out.png",bg::png_tag{});
}
结果是:
你可以猜到我从哪里得到的 polar.png
:)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。