Получение цвета пикселей с помощью Magick ++? - PullRequest
8 голосов
/ 06 октября 2011

Я уже задавал этот вопрос, но это было около FreeImage.Теперь я пытаюсь сделать то же самое с ImageMagick (точнее с Magick++).

Все, что мне нужно, это получить значение RGB пикселей на изображении с возможностьюраспечатайте его на экране.Я спросил об этом на форуме ImageMagick, но там никого нет.:-( Кто-нибудь может помочь, пожалуйста?

Ответы [ 2 ]

13 голосов
/ 06 марта 2012

API версии 6

Для объекта " Image " необходимо запросить кэш pixel , а затем работать сЭто.Документация здесь и здесь :

// load an image
Magick::Image image("test.jpg");
int w = image.columns();
int h = image.rows();

// get a "pixel cache" for the entire image
Magick::PixelPacket *pixels = image.getPixels(0, 0, w, h);

// now you can access single pixels like a vector
int row = 0;
int column = 0;
Magick::Color color = pixels[w * row + column];

// if you make changes, don't forget to save them to the underlying image
pixels[0] = Magick::Color(255, 0, 0);
image.syncPixels();

// ...and maybe write the image to file.
image.write("test_modified.jpg");

API версии 7

Доступ к пикселям изменился в версии 7(см .: портирование ), но низкоуровневый доступ все еще присутствует:

MagickCore::Quantum *pixels = image.getPixels(0, 0, w, h);

int row = 0;
int column = 0;
unsigned offset = image.channels() * (w * row + column);
pixels[offset + 0] = 255; // red
pixels[offset + 1] = 0;   // green
pixels[offset + 2] = 0;   // blue
3 голосов
/ 16 апреля 2018

@ Ответ Sga у меня не сработал, я использую библиотеку ImageMagick-7.0.7-Q8 (глубина 8 бит).

Вот как я это сделал, чтобы сканировать изображение пиксель за пикселем и выводить значение RGB каждого из них:

// "InitializeMagick" called beforehand!
void processImage()
{
    std::ifstream fin;

    std::stringstream fs;
    fs << "/img.png";
    std::cout << "Opening image \"" << fs.str() << "\".." << std::endl;

    try
    {
        Image img;
        img.read( fs.str() );
        int imgWidth = img.columns();
        int imgHeight = img.rows();

        std::cout << "Image width: " << imgWidth << std::endl;
        std::cout << "Image height: " << imgHeight << std::endl;
        std::cout << "Image channels: " << img.channels() << std::endl;

        img.modifyImage();

        for ( int row = 0; row <= imgHeight; row++ )
        {
            for ( int column = 0; column <= imgWidth; column++ )
            {
                ColorRGB px = img.pixelColor( column, row );
                std::cout << "Pixel " << column << "," << row << " R: " << px.red() << " G: " << px.green() <<
                            " B: " << px.blue() << std::endl;
            }
        }

    }
    catch ( Magick::Exception & error )
    {
        std::cerr << "Caught Magick++ exception: " << error.what() << std::endl;
    }

    fin.close(); // Close the file
}
...