【问题标题】:How to use CImg functions with pixel data?如何对像素数据使用 CImg 函数?
【发布时间】:2023-03-13 05:36:01
【问题描述】:

我正在使用 Visual Studio,并希望找到一个有用的图像处理库来处理基本的图像处理功能,例如旋转,这样我就不必手动编写它们了。我遇到了 CImg,它支持这一点,以及许多其他有用的功能,以及插值。

但是,我看到的所有示例都显示通过加载和使用完整图像来使用 CImg。我想处理像素数据。所以我的循环是典型的:

for (x=0;x<width; x++)
for (y=0;y<height; y++)

我想在这种情况下执行双线性或双三次旋转,我看到 CImg 支持这一点。它提供了一个 rotate() 和 get_rotate 函数等。

我在网上找不到任何示例来说明如何将其与像素数据一起使用。理想情况下,我可以简单地将像素颜色、x、y 和插值方法传递给它,然后让它返回结果。

谁能提供任何有用的建议?如果 CImg 不适合这种类型的库,有人可以推荐一个简单、轻量级、易于使用的库吗?

谢谢!

【问题讨论】:

  • 比用于迭代像素数据的循环头更重要的是内存中的布局。它是 RBG 交错的,它是彩色平面,它有一个行跨度还是它是紧密排列的?如果您有这些信息,您可能能够使用“共享”CImg 包装指向图像数据的指针,并就地执行操作而无需额外复制。
  • 我不明白你的问题。您只看到 CImg 与完整图像一起使用 - 您是否想以某种方式处理图像的一部分?你想使用循环——很好,你可以使用 CImg 的循环。您想使用像素数据 - 所有光栅图像都有像素数据,所以是什么阻止您处理像素数据。您可以创建一个包含像素数据的 CImg。我看不出你遇到了什么问题。

标签: c++ cimg


【解决方案1】:

您可以使用迭代器将像素数据复制到CImg 类,并在完成后将其复制回来。

std::vector<uint8_t> pixels_src, pixels_dst;
size_t width, height, n_colors;

// Copy from pixel data
cimg_library::CImg<uint8_t> image(width, height, 1, n_colors);
std::copy(pixels_src.begin(), pixels_src.end(), image.begin());

// Do image processing

// Copy to pixel data
pixels_dst.resize(width * height * n_colors);
std::copy(image.begin(), image.end(), pixels_dst.begin());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多