我正在使用.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”的内容。
有什么想法吗?感谢
答案 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);