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

问题描述

我想使用imagemagick ++ API进行此操作(如主题所示)。我特别想读取(DSLR相机)拍摄所使用的焦距。 [EDIT] 这是处理图像的程序的一部分 [END EDIT]

我知道我可以通过系统调用调用命令identify -verbose <image_filename>(例如,使用popen来做到这一点,这样我就可以读取输出并查找包含FocalLengthIn35mmFilm的行) 。但这很重要,原因有两个:

  • 那是总的和低效的。
  • identifyImageMagick实用程序,因此,如果该命令可以执行此操作,那么我应该能够使用ImageMagick的API来执行此操作。

请注意,正如主题所述,我正在处理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;
}