【问题标题】:Getting RGB values of every pixel in a gif file获取 gif 文件中每个像素的 RGB 值
【发布时间】:2013-10-29 04:12:45
【问题描述】:

我正在尝试学习 Magick++,特别是为图像的每个像素输出 RGB 值的方法。在这里,我有一个 gif 文件和以下 C++ 代码来实现该任务。由于某种原因,它产生的大多是 0 的三元组,带有一些不代表图像实际颜色的垃圾值的罕见实例。我做错了什么?

Link to an image

#include <Magick++.h>
#include <iostream>

using std::cout;
using std::endl;
using namespace Magick;

int main()
{
    Image image("forest.gif");
    image.modifyImage();
    image.type(TrueColorType);
    int nx = image.columns();
    int ny = image.rows();

    PixelPacket *pixel_cache = image.getPixels(0,0,nx,ny);
    for (int i = 0; i < nx; ++i)
    {
        for (int j = 0; j < ny; ++j)
        {
            PixelPacket* pix = pixel_cache + j*nx + i;
            cout << pix->red << " " << pix->green << " " << pix->blue << endl;
        }
    }

    return 0;
}

【问题讨论】:

    标签: c++ imagemagick magick++


    【解决方案1】:

    看来问题出在j*nx + i
    您正在遍历 i for 循环中的列,然后遍历 j for 循环中的行。我希望内存中的值按行顺序存储,因此我强烈建议交换循环,以便遍历外部循环中的行和内部循环中的列。
    但是,无论如何,除非图像按列顺序存储在内存中(我不知道 Magick++,但我认为这极不可能),否则 j*nx 实际上通常指向实际图像之外的内存位置 -因此是垃圾数据。

    只需将变量交换为

    for (int i = 0; i < ny; ++i)
    {
        for (int j = 0; j < nx; ++j)
        {
            PixelPacket* pix = pixel_cache + i*ny + j;
            cout << pix->red << " " << pix->green << " " << pix->blue << endl;
        }
    }
    

    【讨论】:

    • 不,不幸的是它没有帮助。我肯定会得到不同类型的值,但它们仍然是错误的。此外,这个page 表明我的循环顺序是正确的。
    【解决方案2】:

    您可以尝试将图像写入一个简单的缓冲区,之后您可以轻松访问数据

    char buffer[image.columns()*image.rows()*3]; 
    image.write(0, 0, image.columns(), image.rows(), "RGB", Magick::CharPixel, buffer);
    

    【讨论】:

      猜你喜欢
      • 2013-04-10
      • 1970-01-01
      • 1970-01-01
      • 2013-11-19
      • 1970-01-01
      • 2021-08-10
      • 2021-11-01
      • 2023-03-24
      • 1970-01-01
      相关资源
      最近更新 更多