在MATLAB中,我曾经去过:
info = imfinfo('image.jpg');
iso = info.DigitalCamera.ISOSpeedRatings;
就是这样。 Octave具有imfinfo
函数,可从图像标题中读取许多参数,但显然不是ISO速度。这看起来很奇怪(为什么它会读取几十个参数并让ISO速度降低?)。
我有什么遗失的吗?
示例图像为here,使用数码单反相机拍摄(正如您在imfinfo中看到的那样)。使用MATLAB,我可以清楚地看到imfinfo('image.jpg').DigitalCamera.ISOSpeedRatings
是200
。
答案 0 :(得分:3)
您想要的值位于字段PhotographicSensitivity
下。使用击>
iso = imfinfo ("image.jpg").DigitalCamera.PhotographicSensitivity;
击> <击> 撞击>
见Octave bug #47706。 Octave仅考虑Exif版本2.3之后的标签。
Octave图像包的旧版本具有函数readexif
(该函数在映像包版本2.2.0中已弃用,在版本2.4.0中已删除),它可能能够读取它们。包含该功能的最后一个版本是2.2.2
您要访问的详细信息是图像文件中的EXIF值。基本上,您的文件上有一个表格,用于将标记(例如ExposureTime
或FNumber
)映射到其实际值。但是,标记名称不会在文件中编码。相反,每个标签具有整数值,例如,ExposureTime
或FNumber
将分别显示为33437和33434。将这些整数值映射到标记名称是程序/库的作用。
您要查找的代码ISOSpeedRatings
不是EXIF specs version 2.3(2010年发布的最新规范)的有效EXIF代码。它已重命名为PhotographicSensitivity
。如果您阅读该标签下的规格,您会看到以下注释:
请注意,此标记在本标准版本中称为“ISOSpeedRatings”,最高版本为2.21。
如果您阅读更多规格,您会在附件G中找到以下说明:
[...] ID为34855的PhotographicSensitivity标签之前被称为ISOSpeedRating,实际上导致了对敏感度的混淆解释导致许多记录与ISO 12232标准中定义的ISO速度不同
如果您阅读更多规范,您会注意到标记34855的值的含义在名称更改时略有改变。这意味着它不仅仅是标签名称问题,如果您的相机遵循不同版本的EXIF规格,它的含义会有所不同(假设您的相机正确记录了它,请记住更改的原因是相机记录错误的东西)。
我不确定什么是正确的技术答案。我猜一个程序应该检查记录的ExifVersion(这是EXIF标签36864)并根据它更改标签名称。
Octave使用GraphicsMagick读取图像,包括其元数据。 GraphicsMagick不接受EXIF标签号,程序需要使用标签名称进行查询。然后Octave有一个硬编码的标签名称列表,但只包含Exif规范2.3的标签。似乎GraphicsMagick识别您的文件是Exif的旧版本,并将标签命名为Octave不要求的标记。
答案 1 :(得分:0)
我做了以下操作,现在可以在图像2.6.1中使用2.2.2中的readexif:
pkg load image
readexif(JPGPath).Exif_IFD_Pointer.ISOSpeedRatings