0

我正在使用 .net 框架从 jpg 文件中读取 exif 元数据。问题是如何将 PropertyItem.Value(即字节数组)转换为可读形式,例如字符串。

例如,我使用此代码读取图片的 GPSAltitude 值:

        var pic = System.Drawing.Image.FromFile(@"c:\mypic.jpg");
        var GPSAltitude = pic.GetPropertyItem(6);

GPSAltitude.Value 是一个像这样的字节数组:{75,2,0,0,1,0,0,0}。

我知道高度是 587 msl .. 但是我如何从那个字节数组转到 587 ?

我试图用 ASCIIencoding 和其他一些编码来阅读它,但我得到了类似“K\0\0\0\0\0”的东西。

任何想法 ?谢谢

4

3 回答 3

5

除了已经给出的答案之外,您可能还想查看实际的Exif 规范

GPS海拔高度(第 47 页)

指示基于 GPSAltitudeRef 中的参考的高度。高度表示为一个 RATIONAL 值。参考单位是米。

GPSAltitudeRef(第 47 页)

指示用作参考高度的高度。如果参考是海平面并且海拔高度高于海平面,则给出 0。如果海拔低于海平面,则给出值 1,并且海拔在 GPSAltitude 标签中显示为绝对值。参考单位是米。请注意,此标签是 BYTE 类型,与其他参考标签不同。

理性(第 14 页)

两个长。第一个 LONG 是分子,第二个 LONG 表示分母。

(第 14 页)

一个 32 位(4 字节)无符号整数。

所以,{75, 2, 0, 0, 1, 0, 0, 0}{75, 2, 0, 0} / {1, 0, 0, 0}。当您将字节读取为小端字节序时,您得到0000 0010 0100 1011 / 0000 0000 0000 0001的计算结果为 587。其他答案解释了如何获得答案,但希望这能解释为什么会这样。

于 2012-06-21T13:32:14.450 回答
1

只需将您转换byte[]为 anint即可查看您期望的 587 值:

var pic = System.Drawing.Image.FromFile(@"c:\mypic.jpg");         
var GPSAltitude = pic.GetPropertyItem(6); 
var altitude = System.BitConverter.ToInt32(GPSAltitude,0);
于 2012-06-21T13:15:31.670 回答
1

可能BitConverter会起作用。

public static void Main()
   {

      byte[] bytes = {75, 2, 0, 0, 1, 0, 0, 0};
      int result = BitConverter.ToInt32(bytes, 0);
      Console.WriteLine("Returned value: {0}", result);
      Console.ReadLine();
   }

结果是:587

于 2012-06-21T13:09:16.467 回答