问题描述
我想使用imagemagick ++ API进行此操作(如主题所示)。我特别想读取(DSLR相机)拍摄所使用的焦距。 [EDIT] 这是处理图像的程序的一部分 [END EDIT]
我知道我可以通过系统调用来调用命令identify -verbose <image_filename>
(例如,使用popen
来做到这一点,这样我就可以读取输出并查找包含FocalLengthIn35mmFilm
的行) 。但这很重要,原因有两个:
- 那是总的和低效的。
-
identify
是ImageMagick
实用程序,因此,如果该命令可以执行此操作,那么我应该能够使用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;
}