gpt4 book ai didi

c++ - 使用 Boost.GIL 将图像转换为 "raw"字节

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:56:33 25 4
gpt4 key购买 nike

目标

我正在尝试转向 Boost GIL 以替换我已经实现的一些类似功能,这些功能已达到其可维护生命的终点。

我现有的代码可以使用 uint8_t* 处理 24 BPP、8 位 RGB 图像.我无法更改它,因为相同的接口(interface)用于显示来自不同位置(例如 OpenGL 缓冲区)的图像,并且已经有相当多的代码。

因此,我尝试逐步使用 GIL,首先读取文件并将像素逐字节复制到 std::vector<uint8_t> 中我可以用它来管理存储,但仍然得到 uint8_t*通过使用 &vector[0] .

这可以透明地放在现有接口(interface)后面,直到重构有意义为止。

我尝试过的

我认为这应该是使用 copy_pixels() 的简单案例有两个适当构造的 View 。

我整理了一个最小的、完整的示例,它说明了我通过查看文档并进行尝试所设法实现的总和:

#include <boost/gil/rgb.hpp>
#include <boost/gil/extension/io/png_dynamic_io.hpp>
#include <stdint.h>
#include <vector>

int main() {
std::vector<uint8_t> storage;
{
using namespace boost::gil;
rgb8_image_t img;
png_read_image("test.png", img);

// what should replace 3 here to be more "generic"?
storage.resize(img.width()*img.height()*3);

// doesn't work, the type of the images aren't compatible.
copy_pixels(const_view(img),
interleaved_view(img.width(), img.height(), &storage[0], 3*img.width()));
}
}

我卡在哪里

这不编译:

error: cannot convert ‘const boost::gil::pixel<unsigned char, boost::gil::layout<boost::mpl::vector3<boost::gil::red_t, boost::gil::green_t, boost::gil::blue_t> > >’ to ‘unsigned char’ in assignment

这是不言自明的 - RGB 像素不能转换为单个 unsigned char自动地。我想我会尝试使用 copy_and_convert_pixels() 解决这个问题,但我看不到这些转换的 3:1 问题(即我在源图像中每个像素的输出中有 3 个 unsigned char s)问题。转换似乎更针对色彩空间转换(例如 RGB->HSV)或包装更改。

最佳答案

我会单独 push_back rgb8_pixel_t 的每种颜色:

struct PixelInserter{
std::vector<uint8_t>* storage;
PixelInserter(std::vector<uint8_t>* s) : storage(s) {}
void operator()(boost::gil::rgb8_pixel_t p) const {
storage->push_back(boost::gil::at_c<0>(p));
storage->push_back(boost::gil::at_c<1>(p));
storage->push_back(boost::gil::at_c<2>(p));
}
};

int main() {
std::vector<uint8_t> storage;
{
using namespace boost::gil;
rgb8_image_t img;
png_read_image("test.png", img);
storage.reserve(img.width() * img.height() * num_channels<rgb8_image_t>());
for_each_pixel(const_view(img), PixelInserter(&storage));
}
...
}

...但我也不是 GIL 方面的专家。

关于c++ - 使用 Boost.GIL 将图像转换为 "raw"字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8300555/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com