đọc hình ảnh trong suốt boost.gil C ++

Jan 17 2021

Tôi có một hình ảnh có nền trong suốt và tôi muốn sao chép nó qua một hình ảnh khác, cả hai hình ảnh đều có định dạng png Tôi đã thử sử dụng boost :: gil :: rgba8_image_t nhưng thay vào đó nó vẫn sao chép hình ảnh trong suốt với nền màu xám. đây là những gì tôi đã sử dụng

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

Trả lời

3 sehe Jan 17 2021 at 08:20

Ừm. Đọc điều này, nó dường như làm chính xác những gì bạn yêu cầu:

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

Thao tác này sẽ lấp đầy các pixel bằng chế độ xem đã thay đổi kích thước của hình ảnh đầu vào của bạn. Kích thước mới khớp chính xác với kích thước của nhà tù của bạn. Hiện nay:

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

Sao chép tất cả các pixel từ jailhình ảnh trên đó. Điều này thay thế bất kỳ pixel nào bạn vừa điền từ hình ảnh đầu vào đã thay đổi kích thước.

Đầu ra của bạn sẽ trông như thế nào

Lưu ý cách nền được kẻ ca rô. Đây là kiểu thông thường để chỉ độ trong suốt. Đó không phải là màu xám. Nó chỉ là các pixel trống với độ trong suốt hoàn toàn.

Những gì bạn có lẽ muốn là giữ lại các pixel nền. Dường như không có hoạt động pixel cấp cao trong Boost GIL¹, nhưng bạn tự viết:

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

Bây giờ bạn viết mainnhư sau:

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

Và kết quả là:

Bạn có thể đoán nơi tôi lấy polar.png:)

¹ xem ví dụ: Làm thế nào để kết hợp hình ảnh với boost gil?