使用.net框架读取exif数据(System.Drawing.Imaging)

时间:2012-06-21 13:02:31

标签: c# .net exif

我正在使用.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 m.s.l ...但是如何从该字节数组转到587?

我尝试用ASCII编码和其他一些编码来读它,但我得到类似“K \ 0 \ 0 \ 0 \ 0 \ 0”的内容。

有什么想法吗?感谢

3 个答案:

答案 0 :(得分:5)

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

GPSAltitude (第47页)

根据GPSAltitudeRef中的参考值指示海拔高度。海拔高度表示为一个RATIONAL值。参考单位是米。

GPSAltitudeRef (第47页)

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

RATIONAL (第14页)

两个LONG。第一个LONG是分子,第二个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.其他答案解释如何得到答案,但希望这可以解释为什么会这样。

答案 1 :(得分: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

答案 2 :(得分:1)

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

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