使用 imagemagick++ 从 PNG 文件中读取元数据
Read metadata from a PNG file with imagemagick++
我想使用 imagemagick++ API 来执行此操作(如主题所示)。我特别想读取(单反相机)拍摄时使用的焦距。 [编辑] 这是处理图像的程序的一部分 [结束编辑]
我知道我可以通过系统调用来完成,调用命令 identify -verbose <image_filename>
(例如,使用 popen
这样我就可以读取输出并查找包含 [=12= 的行]).但这很恶心,原因有二:
- 这只是粗俗和低效。
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;
}
我想使用 imagemagick++ API 来执行此操作(如主题所示)。我特别想读取(单反相机)拍摄时使用的焦距。 [编辑] 这是处理图像的程序的一部分 [结束编辑]
我知道我可以通过系统调用来完成,调用命令 identify -verbose <image_filename>
(例如,使用 popen
这样我就可以读取输出并查找包含 [=12= 的行]).但这很恶心,原因有二:
- 这只是粗俗和低效。
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;
}