使用 imagemagick++ 从 PNG 文件中读取元数据

Read metadata from a PNG file with imagemagick++

我想使用 imagemagick++ API 来执行此操作(如主题所示)。我特别想读取(单反相机)拍摄时使用的焦距。 [编辑] 这是处理图像的程序的一部分 [结束编辑]

我知道我可以通过系统调用来完成,调用命令 identify -verbose <image_filename>(例如,使用 popen 这样我就可以读取输出并查找包含 [=12= 的行]).但这很恶心,原因有二:

请注意,正如主题所说,我正在处理 PNG 文件;但是,首选可以使用任何无损图像格式的解决方案。

ImageMagick 不是 EXIF 编辑器,因此最好的选择是将配置文件 EXIF 有效负载转储到 libexif API。但是,如果您只是在一个值上达到峰值,您可以使用 ImageMagick 的 percent escape 机制来检索一个值。

例如:

#include <iostream>
#include <string>
#include <Magick++.h>

using namespace Magick;

int main()
{
    InitializeMagick((const char *)nullptr);
    Image img("DSCF2763.JPG");
    Blob data;
    MagickCore::SetImageOption(img.imageInfo(), "format", "%[EXIF:FocalLengthIn35mmFilm]");
    img.write(&data, "INFO");
    std::string value((const char *)data.data(), data.length());
    std::cout << value << std::endl;
}

以上与CLI命令相同:

convert DSCF2763.JPG -define "format=%[EXIF:FocalLengthIn35mmFilm]" info:

更新

一个更简单的方法是使用 Magick::Image.attribute()

#include <iostream>
#include <string>
#include <Magick++.h>

using namespace Magick;

int main()
{
    InitializeMagick((const char *)nullptr);
    Image img("DSCF2763.JPG");
    std::string value = img.attribute("EXIF:FocalLengthIn35mmFilm");
    std::cout << value << std::endl;
}