saydam resimleri okumak boost.gil C ++

Jan 17 2021

Şeffaf bir arka plana sahip bir resmim var ve onu başka bir resmin üzerine kopyalamak istiyorum, her iki resim de png formatında boost :: gil :: rgba8_image_t kullanarak denedim ama yine de şeffaf resmi bunun yerine gri bir arkaplanla kopyalıyor. bu benim kullandım

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

Yanıtlar

3 sehe Jan 17 2021 at 08:20

Mmm. Bunu okuduğunuzda, tam olarak istediğiniz şeyi yapıyor gibi görünüyor:

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

Bu, pikselleri giriş görüntünüzün yeniden boyutlandırılmış bir görünümüyle doldurur. Yeni boyut tam olarak sizin hapishanenizin boyutuna uyuyor. Şimdi:

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

Görüntüdeki tüm pikselleri üzerine kopyalar jail. Bu, yeniden boyutlandırılan giriş görüntüsünden yeni doldurduğunuz piksellerin yerini alır.

Çıktı şöyle görünürdü

Arka planın nasıl damalı olduğuna dikkat edin. Bu, şeffaflığı gösteren geleneksel kalıptır. Bu gri değil. Tam şeffaflığa sahip boş piksellerdir.

Muhtemelen istediğiniz şey arka plan piksellerini korumaktı. Boost GIL¹'da yüksek seviye piksel işlemi yok gibi görünüyor, ancak bunu kendiniz yazıyorsunuz:

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

Şimdi şöyle yazıyorsun 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{});
}

Ve sonuç:

Nereden aldığımı tahmin edebilirsiniz polar.png:)

¹ bkz. Örneğin görüntüleri boost gil ile nasıl birleştirebilirim?