Я пытаюсь получить цвет пикселя в изображении jpg, и все учебники, которые я могу найти в Интернете, говорят об использовании пиксельного пакета, которого больше не существует. поиск и поиск в Google, я обнаружил, что getvirtualpixels может быть новым способом, но, похоже, его нет и в самой новой версии. так как мне получить цвет пикселей из изображения с кешем изображения? Кстати, мне не нужно устанавливать какие-либо пиксели. Использование Windows10 и Visual Studio 2015
Magick++ получает цвет пикселя. pixelpacket больше не существует
Ответы (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();
// ...