透明な画像を読むboost.gilC ++

Jan 17 2021

背景が透明な画像があり、別の画像にコピーしたいのですが、両方の画像は、boost :: gil :: rgba8_image_tを使用して試したpng形式ですが、代わりに背景が灰色の透明な画像をコピーします。これは私が使用したものです

#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{});
}

回答

3 sehe Jan 17 2021 at 08:20

うーん。これを読むと、あなたが尋ねたことを正確に実行しているようです。

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画像からすべてのピクセルをコピーします。これにより、サイズ変更された入力画像から入力したピクセルが置き換えられます。

出力は次のようになります

背景がどのようにチェックされているかに注意してください。これは、透明度を示すための従来のパターンです。それは灰色ではありません。完全に透明な空のピクセルです。

おそらくあなたが望んでいたのは、背景のピクセルを維持することでした。BoostGIL¹には高レベルのピクセル操作はないようですが、自分で作成します。

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:)

¹たとえば、画像をブーストギルと組み合わせる方法を参照してください。