簡體   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