C#图片处理之: 获取数码相片的EXIF信息(二)
2007-05-29 20:34
483 查看
还是边看个实例边聊吧,我们会讨论一些常用的ExifPropertyTagID,并了解如何得到它们的值。请牢记,MSDN是很好的资源。
随便打开张我拍的照片,按上次说的方法扫描每一个Exif属性项目。
第一项的ID是0x010F。查MSDN,发现是“Null-terminated character string that specifies the manufacturer of the equipment used to record the image.”,原来是相机的制造商啊。再一看,Type == 2,嗯,还真不矛盾,调用解Type==2的函数:
private static string GetValueOfType2(byte[] b)
{
return System.Text.Encoding.ASCII.GetString(b);
}
于是得到这样的文字:
EASTMAN KODAK COMPANY
没错,我的正是柯达。继续往下看,第二项的ID是0x0110,老规矩MSDN,发现是“Null-terminated character string that specifies the model name or model number of the equipment used to record the image.”,原来是型号。Type还是2,继续调用刚才的函数,结果就是:
KODAK Z7590 ZOOM DIGITAL CAMERA
完全正确,加十分。
接着往下走,看到有个ID==0x8827(ISO Speed)的类型是3。查MSDN得知是16位无符号整数。把Value[1]左移8位放在Value[0]之前就可以了。
private static string GetValueOfType3(byte[] b)
{
f (b.Length != 2) return "无效的类型(3)";
return Convert.ToUInt16(b[1] << 8 | b[0]).ToString();
}
我的值是80,没错。0xA002和0xA003一起描述了图片的原始大小,也可用这个方法求出来。
Type==4和Type==3情况类似,只不过Type=4时表示一个32位的无符号整数。
private static string GetValueOfType4(byte[] b)
{
if (b.Length != 4) return "无效的类型(4)";
return Convert.ToUInt32(b[3] << 24 | b[2] << 16 | b[1] << 8 | b[0]).ToString();
}
例子是ID==0x0202(JPEG Inter Length)
Type==5也比较多,例如曝光时间(0x829A)。
这种类型包含了两个无符号的长整型数字。但处理起来也并不难。把8个字节分成两份,Value[0~3]是分母,Value[4~7]是分子。但同样别忘了移位。
private static string GetValueOfType5(byte[] b)
{
if (b.Length != 8) return "无效的类型(5)";
UInt32 fm, fz;
fm = 0;
fz = 0;
fz = Convert.ToUInt32(b[7] << 24 | b[6] << 16 | b[5] << 8 | b[4]);
fm = Convert.ToUInt32(b[3] << 24 | b[2] << 16 | b[1] << 8 | b[0]);
return fm.ToString() + "/" + fz.ToString();
}
我的样本照片曝光时间是1/500。同类型的比较常用的ID还有0x829D(F-Number),0x011A,0x011B(分别代表x/y方向上的分辨率),0x9202(Lens aperture)等。
Type==7的比较乱,至少我的柯达图片不能被用统一的方式解码。0x9000(Exif版本),0xA000(Exif FPX版本)可以这么求:
private static string GetValueOfType7A(byte[] b)
{
string rtn = "";
for (int i = 0; i < b.Length; i++)
{
rtn += ((char)b[i]).ToString();
}
return rtn;
}
但0x9101(Exif压缩配置)需要这么解码才正确:
private static string GetValueOfType7B(byte[] b)
{
string rtn = "";
for (int i = 0; i < b.Length; i++)
{
rtn += b[i].ToString();
}
return rtn;
}
搞不懂,谁知道请告诉我。
最后看一下类型10。其实和类型5差不多,只不过类型10是有符号的,这里也就不多罗嗦了。
随便打开张我拍的照片,按上次说的方法扫描每一个Exif属性项目。
第一项的ID是0x010F。查MSDN,发现是“Null-terminated character string that specifies the manufacturer of the equipment used to record the image.”,原来是相机的制造商啊。再一看,Type == 2,嗯,还真不矛盾,调用解Type==2的函数:
private static string GetValueOfType2(byte[] b)
{
return System.Text.Encoding.ASCII.GetString(b);
}
于是得到这样的文字:
EASTMAN KODAK COMPANY
没错,我的正是柯达。继续往下看,第二项的ID是0x0110,老规矩MSDN,发现是“Null-terminated character string that specifies the model name or model number of the equipment used to record the image.”,原来是型号。Type还是2,继续调用刚才的函数,结果就是:
KODAK Z7590 ZOOM DIGITAL CAMERA
完全正确,加十分。
接着往下走,看到有个ID==0x8827(ISO Speed)的类型是3。查MSDN得知是16位无符号整数。把Value[1]左移8位放在Value[0]之前就可以了。
private static string GetValueOfType3(byte[] b)
{
f (b.Length != 2) return "无效的类型(3)";
return Convert.ToUInt16(b[1] << 8 | b[0]).ToString();
}
我的值是80,没错。0xA002和0xA003一起描述了图片的原始大小,也可用这个方法求出来。
Type==4和Type==3情况类似,只不过Type=4时表示一个32位的无符号整数。
private static string GetValueOfType4(byte[] b)
{
if (b.Length != 4) return "无效的类型(4)";
return Convert.ToUInt32(b[3] << 24 | b[2] << 16 | b[1] << 8 | b[0]).ToString();
}
例子是ID==0x0202(JPEG Inter Length)
Type==5也比较多,例如曝光时间(0x829A)。
这种类型包含了两个无符号的长整型数字。但处理起来也并不难。把8个字节分成两份,Value[0~3]是分母,Value[4~7]是分子。但同样别忘了移位。
private static string GetValueOfType5(byte[] b)
{
if (b.Length != 8) return "无效的类型(5)";
UInt32 fm, fz;
fm = 0;
fz = 0;
fz = Convert.ToUInt32(b[7] << 24 | b[6] << 16 | b[5] << 8 | b[4]);
fm = Convert.ToUInt32(b[3] << 24 | b[2] << 16 | b[1] << 8 | b[0]);
return fm.ToString() + "/" + fz.ToString();
}
我的样本照片曝光时间是1/500。同类型的比较常用的ID还有0x829D(F-Number),0x011A,0x011B(分别代表x/y方向上的分辨率),0x9202(Lens aperture)等。
Type==7的比较乱,至少我的柯达图片不能被用统一的方式解码。0x9000(Exif版本),0xA000(Exif FPX版本)可以这么求:
private static string GetValueOfType7A(byte[] b)
{
string rtn = "";
for (int i = 0; i < b.Length; i++)
{
rtn += ((char)b[i]).ToString();
}
return rtn;
}
但0x9101(Exif压缩配置)需要这么解码才正确:
private static string GetValueOfType7B(byte[] b)
{
string rtn = "";
for (int i = 0; i < b.Length; i++)
{
rtn += b[i].ToString();
}
return rtn;
}
搞不懂,谁知道请告诉我。
最后看一下类型10。其实和类型5差不多,只不过类型10是有符号的,这里也就不多罗嗦了。
相关文章推荐
- C#图片处理惩罚之: 获取数码相片的EXIF信息
- C#图片处理之: 获取数码相片的EXIF信息
- C#图片处理之: 获取数码相片的EXIF信息(二)
- 使用imageIO获取和修改图片的exif信息
- C# 获取图片的EXIF 信息 .
- 图片Exif 信息中Orientation的理解和对此的处理
- 用C#读取数码相片的EXIF信息(一)
- 用C#读取数码相片的EXIF信息(一)
- 图像处理2_读取JPG图片的Exif属性(一) - Exif信息简介
- IOS: 使用imageIO获取和修改图片的exif信息
- C# 获取图片的EXIF 信息
- Java获取照片EXIF信息——看看你的图片有没有ps?
- 利用php获取图片完整Exif信息类 获取图片详细完整信息类
- IOS 如何获取与修改图片的EXIF信息
- php通过exif_read_data函数获取图片的exif信息
- C# 获取图片的EXIF 信息
- Android 图片Exif信息相关的获取与修改
- Android 获取图片exif信息
- PHP 获取图片信息exif
- ios获取图片exif信息