Magick ++获得像素颜色。 pixelpacket似乎不再存在

时间:2016-06-19 04:31:36

标签: c++ imagemagick magick++

我正在尝试获取jpg图像中像素的颜色,我在网上找到的所有教程都说要使用不再存在的pixelpacket。通过谷歌搜索和搜索我发现getvirtualpixels可能是新方式,但在最新版本中似乎也不存在。那么如何从带有图像缓存的图像中获取像素的颜色?我不需要设置任何像素btw。 使用windows10和visual studio 2015

1 个答案:

答案 0 :(得分:2)

PixelPacket结构已替换为指向Quantum数据类型的指针。从Porting to ImageMagick Version 7开始,要理解的关键是像素现在可以拥有动态部分(或者#34;特征"之前称为"频道")。

  

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
 */

但是!有时,将图像数据导出为您已经使用过的格式会更容易。例如,我可能只需要Green值作为单点浮点列表。

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