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

使用imagemagick+;从PNG文件读取元数据+;,imagemagick,png,metadata,Imagemagick,Png,Metadata,我想使用imagemagick++API实现这一点(如主题所示)。我特别想读取(单反相机)拍摄时使用的焦距[EDIT]这是处理图像的程序的一部分[END EDIT] 我知道我可以通过系统调用,调用命令identify-verbose(例如,使用popen,以便读取输出并查找包含聚焦长度为35mm胶片的行)。但这是因为两个原因: 这只是粗俗和低效 identify是一个ImageMagick实用程序,因此,如果该命令可以执行,那么我应该能够使用ImageMagick的API执行 注意,正如主题

我想使用imagemagick++API实现这一点(如主题所示)。我特别想读取(单反相机)拍摄时使用的焦距[EDIT]这是处理图像的程序的一部分[END EDIT]

我知道我可以通过系统调用,调用命令
identify-verbose
(例如,使用
popen
,以便读取输出并查找包含
聚焦长度为35mm胶片的行)。但这是因为两个原因:

  • 这只是粗俗和低效
  • identify
    是一个
    ImageMagick
    实用程序,因此,如果该命令可以执行,那么我应该能够使用ImageMagick的API执行

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

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

例如:

#包括
#包括
#包括
使用名称空间Magick;
int main()
{
初始化magick((const char*)nullptr);
图像img(“DSCF2763.JPG”);
Blob数据;
MagickCore::SetImageOption(img.imageInfo(),“格式”,“%[EXIF:FocalLength In35mmFilm]”;
img.写入(&数据,“信息”);
字符串值((const char*)data.data(),data.length());

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

例如:

#包括
#包括
#包括
使用名称空间Magick;
int main()
{
初始化magick((const char*)nullptr);
图像img(“DSCF2763.JPG”);
Blob数据;
MagickCore::SetImageOption(img.imageInfo(),“格式”,“%[EXIF:FocalLength In35mmFilm]”;
img.写入(&数据,“信息”);
字符串值((const char*)data.data(),data.length());

std::cout如果您只是想要元数据,而不是整个Magick++开发套件及其图像处理功能,您可能会发现
exiv2
更轻…这是一个好的观点,我在我的OP中没有明确指出(我只是编辑它以表明我确实需要操作图像,这就是我使用imagemagick的API的原因)显然,我不知道您需要对图像进行多少处理,但您可能会发现,CImg at中相当全面的功能足以满足您的需要,而且重量非常轻,因为它只是一个包含文件,没有可链接的库。可能是CImg与exiv2相结合是一种解决方案。请不要误解我,我不是tr我建议你不要使用Magick++,我只是在探索其他可能性。我正在做的任何“繁重”处理都是在我获得像素值作为(x,y)函数后进行的;当然,我还需要读取PNG文件并写入生成的PNG输出。就图像库而言,这是相当基本的。不过,我要说的是,尽管指针很受欢迎(我一定会研究这个CImg库),惯性是一个非常强大的东西,我的程序的基本版本已经使用了imgmagick++;CImg不能解决手头的问题(因为我还需要使用exiv2),因此我现在将继续使用imgmagick++。FWIW,我已经添加了
popen
/
identifite-verbose…
代码,并在我当前的“开发分支”中成功获得了焦距我非常希望通过API实现它;但更糟糕的是,我可以使用
popen
/
identification-verbose
方法,即使我觉得它很难看(它可以工作)如果您只是想要元数据,而不是整个Magick++开发套件及其图像处理功能,您可能会发现
exiv2
重量更轻…这一点很好,而且我的OP中没有明确说明(我只是编辑了它,以指示我确实需要操作图像,这就是我使用imagemagick API的原因)显然,我不知道您需要对图像进行多少处理,但您可能会发现,CImg at中相当全面的功能足以满足您的需要,而且重量非常轻,因为它只是一个包含文件,没有可链接的库。可能是CImg与exiv2相结合是一种解决方案。请不要误解我,我不是tr我建议你不要使用Magick++,我只是在探索其他可能性。我正在做的任何“繁重”处理都是在我获得像素值作为(x,y)函数后进行的;当然,我还需要读取PNG文件并写入生成的PNG输出。就图像库而言,这是相当基本的。不过,我要说的是,尽管指针很受欢迎(我一定会研究这个CImg库),惯性是一个非常强大的东西,我的程序的基本版本已经使用了imgmagick++;CImg不能解决手头的问题(因为我还需要使用exiv2),因此我现在将继续使用imgmagick++。FWIW,我已经添加了
popen
/
identifite-verbose…
代码,并在我当前的“开发分支”中成功获得了焦距我非常希望通过API实现它;但更糟糕的是,我可以使用
popen
/
identification-verbose
方法,即使我觉得它很难看(它可以工作)。第二个版本看起来更干净(无论如何更简单)。起初,我认为它可能无法工作,因为存在EXIF(我认为EXIF是一个JPEG专用的东西),但我只是尝试了一下,它就像一个符咒!第二个版本看起来更干净(无论如何更简单)。起初,我认为它可能不起作用,因为EXIF(我认为EXIF是一个JPEG)
convert DSCF2763.JPG -define "format=%[EXIF:FocalLengthIn35mmFilm]" info: