투명한 이미지 읽기 boost.gil C ++

Jan 17 2021

투명한 배경을 가진 이미지가 있고 다른 이미지 위에 복사하고 싶습니다. 이것은 내가 사용한 것입니다

#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위에 이미지의 모든 픽셀을 복사 합니다. 이렇게하면 크기가 조정 된 입력 이미지에서 방금 채운 모든 픽셀이 바뀝니다.

출력은 다음과 같습니다.

배경이 어떻게 체크 무늬인지 확인하십시오. 이것은 투명도를 나타내는 일반적인 패턴입니다. 회색이 아닙니다. 완전한 투명성을 가진 빈 픽셀입니다.

아마도 당신이 원했던 것은 배경 픽셀을 유지하는 것이 었습니다. 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:)

¹ 예를 들어 부스트 길과 이미지를 결합하는 방법을 참조하십시오 .