我正在尝试学习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;
}
答案 0 :(得分: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;
}
}
答案 1 :(得分:0)
您可以尝试将图像写入简单的缓冲区,之后您可以轻松访问数据
char buffer[image.columns()*image.rows()*3];
image.write(0, 0, image.columns(), image.rows(), "RGB", Magick::CharPixel, buffer);