Magick++ получает цвет пикселя. pixelpacket больше не существует

Я пытаюсь получить цвет пикселя в изображении jpg, и все учебники, которые я могу найти в Интернете, говорят об использовании пиксельного пакета, которого больше не существует. поиск и поиск в Google, я обнаружил, что getvirtualpixels может быть новым способом, но, похоже, его нет и в самой новой версии. так как мне получить цвет пикселей из изображения с кешем изображения? Кстати, мне не нужно устанавливать какие-либо пиксели. Использование Windows10 и Visual Studio 2015


person Aaron    schedule 19.06.2016    source источник


Ответы (1)


Структуры PixelPacket заменены указателем на тип данных Quantum. Из раздела Перенос на ImageMagick версии 7 главное, что нужно понять заключается в том, что пиксель теперь может иметь динамические части (или «черты», ранее называемые «каналами»).

ImageMagick версии 7 поддерживает любое количество каналов от 1 до 32 (и выше) и упрощает доступ с помощью одного метода, возвращающего массив пиксельных каналов типа Quantum.

Теперь вы отвечаете за разработку кода, обрабатывающего детерминированные (это правильный термин?) пиксельные каналы. Например...

Magick::Image rose("rose:");
const Magick::Quantum * q = rose.getConstPixels(5, 5, 1, 1);
size_t channel_length = rose.channels();
for (size_t k = 0; k < channel_length; k++ ) {
    std::cout << "Channel " << k << " = ";
    std::cout << q[k] << " of " << QuantumRange << std::endl;
}
/** Outputs
    -------
    Channel 0 = 13107 of 65535
    Channel 1 = 12079 of 65535
    Channel 2 = 11308 of 65535
 */

Не видя вашего кода и не понимая, какой будет ваша конечная цель, я бы предположил, что вам действительно просто нужна информация RGB. Если это так, Magick::Image.getColor будет работать,

Magick::Image rose("rose:");
Magick::Color pixelColor = rose.pixelColor(5, 5);

std::cout << "Channel 0 = ";
std::cout << pixelColor.quantumRed() << " of " << QuantumRange << std::endl;
std::cout << "Channel 1 = ";
std::cout << pixelColor.quantumGreen() << " of " << QuantumRange << std::endl;
std::cout << "Channel 2 = ";
std::cout << pixelColor.quantumBlue() << " of " << QuantumRange << std::endl;
/** Outputs
    -------
    Channel 0 = 13107 of 65535
    Channel 1 = 12079 of 65535
    Channel 2 = 11308 of 65535
 */

Но! Иногда проще экспортировать данные изображения в формат, с которым вы уже работаете. Например, мне могут понадобиться только зеленые значения в виде одноточечного списка с плавающей запятой.

Magick::Image rose("rose:");
Magick::PixelData pixelBlob(rose, "G", Magick::FloatPixel);
float * buffer = (float *)pixelBlob.data();
// ...
person emcconville    schedule 19.06.2016