繁体   English   中英

获取gif文件中每个像素的RGB值

[英]Getting RGB values of every pixel in a gif file

我正在尝试学习Magick ++,尤其是学习为图像的每个像素输出RGB值的方法。 在这里,我有一个gif文件和以下C ++代码来完成任务。 由于某种原因,它产生的三元组大部分为0,并且很少出现一些垃圾值,这些垃圾值不能代表图像的实际颜色。 我究竟做错了什么?

链接到图片

#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;
}

看来问题出在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;
    }
}

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM