lecture d'images transparentes boost.gil C ++

Jan 17 2021

J'ai une image avec un fond transparent et je veux la copier sur une autre image, les deux images sont au format png J'ai essayé d'utiliser boost :: gil :: rgba8_image_t mais il copie toujours l'image transparente avec un fond gris à la place. c'est ce que j'ai utilisé

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

Réponses

3 sehe Jan 17 2021 at 08:20

Mmm. En lisant ceci, il semble faire exactement ce que vous lui demandez:

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

Cela remplit les pixels avec une vue redimensionnée de votre image d'entrée. La nouvelle taille correspond exactement à celle de votre prison. À présent:

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

Copie tous les pixels de l' jailimage dessus. Cela remplace tous les pixels que vous venez de remplir à partir de l'image d'entrée redimensionnée.

Votre sortie ressemblerait à

Notez comment l'arrière-plan est quadrillé. C'est le modèle conventionnel pour indiquer la transparence. Ce n'est pas gris. Ce ne sont que des pixels vides avec une transparence totale.

Ce que vous vouliez vraisemblablement était de conserver les pixels d'arrière-plan. Il ne semble pas y avoir d'opération de pixel de haut niveau dans Boost GIL¹, mais vous l'écrivez vous-même:

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

Maintenant, vous écrivez maincomme:

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

Et le résultat est:

Vous pouvez deviner où j'ai eu le polar.png:)

¹ voir par exemple Comment combiner des images avec boost gil?