อ่านภาพโปร่งใส boost.gil C ++
ฉันมีรูปภาพที่มีพื้นหลังโปร่งใสและฉันต้องการคัดลอกรูปภาพอื่น ๆ ทั้งสองภาพเป็นรูปแบบ png ฉันได้ลองใช้ boost :: gil :: rgba8_image_t แต่ยังคงคัดลอกรูปภาพโปร่งใสที่มีพื้นหลังสีเทาแทน นี่คือสิ่งที่ฉันเคยใช้
#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{});
}
คำตอบ
อืม. การอ่านสิ่งนี้ดูเหมือนว่าจะทำในสิ่งที่คุณถาม:
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
:)
¹ดูเช่นจะรวมภาพกับ boost gil ได้อย่างไร?