[英]getting a RGB value from a pixel and setting the rgb values back to the same pixel
[英]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.