2

我有一个透明背景的图像,我想将它复制到另一个图像上,这两个图像都是 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::view(pic), bg::png_tag{});
}
4

1 回答 1

4

嗯。阅读此内容似乎完全符合您的要求:

bg::resize_view(bg::view(temp), bg::view(pic), bg::bilinear_sampler{});

这将使用调整大小的输入图像视图填充像素。新尺寸与您的监狱完全匹配。现在:

bg::resize_view(bg::view(temp), bg::view(pic), 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::view(pic), bg::bilinear_sampler{});
    overlay_combine(pic, jail);

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

结果是:

在此处输入图像描述

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

¹ 请参阅如何将图像与 boost gil 结合起来?

于 2021-01-17T01:20:23.853 回答