[英]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.