membaca gambar transparan boost.gil C ++

Jan 17 2021

Saya memiliki gambar dengan latar belakang transparan dan saya ingin menyalinnya ke gambar lain kedua gambar dalam format png Saya sudah mencoba menggunakan boost :: gil :: rgba8_image_t tetapi masih menyalin gambar transparan dengan latar belakang abu-abu. ini yang saya gunakan

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

Jawaban

3 sehe Jan 17 2021 at 08:20

Mmm. Membaca ini sepertinya melakukan apa yang Anda minta:

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

Ini mengisi piksel dengan tampilan yang diubah ukurannya dari gambar masukan Anda. Ukuran baru sama persis dengan penjara Anda. Sekarang:

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

Menyalin semua piksel dari jailgambar di atasnya. Ini menggantikan piksel apa pun yang baru saja Anda isi dari gambar masukan yang diubah ukurannya.

Output Anda akan terlihat seperti

Perhatikan bagaimana latar belakang diberi kotak-kotak. Ini adalah pola konvensional untuk menunjukkan transparansi. Itu bukan abu-abu. Itu hanya piksel kosong dengan transparansi penuh.

Apa yang mungkin Anda inginkan adalah mempertahankan piksel latar belakang. Tampaknya tidak ada operasi piksel tingkat tinggi di Boost GIL¹, tetapi Anda menulisnya sendiri:

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

Sekarang Anda menulis mainseperti:

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

Dan hasilnya adalah:

Anda bisa menebak dari mana saya mendapatkan polar.png:)

¹ lihat misalnya Bagaimana menggabungkan gambar dengan boost gil?