如何使用' CImg'它的基本功能

时间:2014-09-17 06:26:33

标签: c++ image-processing pixel imaging cimg

我一直在努力了解如何使用CImg的绘图功能,但文档对我来说并不是很清楚。我只想画一个像素,但我不明白draw_point是如何工作的。有人可以给出一些draw_point和如何声明图像的例子吗?此外,还有更好的C ++替代品吗?我只想要最简单的C ++成像库。我想逐个像素地操纵一个空图像。还有更好的选择吗?

1 个答案:

答案 0 :(得分:1)

我修改了CImg tutorial以显示如何使用draw_point,代码如下:

#include "CImg.h"

using namespace cimg_library;

int main() 
{

    int size_x = 640;
    int size_y = 480;
    int size_z = 1;
    int numberOfColorChannels = 3; // R G B
    unsigned char initialValue = 0;

    CImg<unsigned char> image(size_x, size_y, size_z, numberOfColorChannels, initialValue);

    CImgDisplay display(image, "Click a point");

    while (!display.is_closed())
    {
        display.wait();
        if (display.button() && display.mouse_y() >= 0 && display.mouse_x() >= 0)
        {
            const int y = display.mouse_y();
            const int x = display.mouse_x();

            unsigned char randomColor[3];
            randomColor[0] = rand() % 256;
            randomColor[1] = rand() % 256;
            randomColor[2] = rand() % 256;

            image.draw_point(x, y, randomColor);
        }
        image.display(display);
    }
    return 0;
}

方法 draw_point 有三个重载,可能会混淆使用。我使用了以下内容:

template<typename tc>
CImg<T>& draw_point(const int x0, const int y0,
                    const tc *const color, const float opacity=1)

有关详细信息,请参阅this

至于替代方案,如果你只想逐个像素地修改数据,也许你可以像使用libpng和libjpeg用于输入/输出的原始数据一样使用图像。

无论如何,我建议您阅读更多关于CImg的文档。我在一些项目中使用它,对我来说它非常方便。