数码图像文件包含确定图像特征的元数据。例如相机品牌和型号。GDI+将单独的元数据段存储在PropertyItem对象中。可读取Image对象的PropertyItems属性以便从某个文件中检索所有的元数据。返回一个PropertyItem对象的数组,具有以下4个属性:Id、Value、Len和Type。Id是用于标识元数据项的标记。表9-1显示一些可赋予Id的值。这里无法插入表,例如0x0320图像标题,0x010F设备厂商,0x0110相机型号,0x829A曝光时间,0x5090亮度表,0x5091色度表等。Value是数组值。这些值的格式由Type属性确定。Len是Value属性指向的值的数组长度(以字节表示)。Type是Value属性指向的数组中值的数据类型。详细说明见C#编程指南清华出版社2011年1月出版。
一个风景照实例,名为IMG_0445.jpg。读取并显示图片文件中的元数据。该列表中的第一个(index 0)属性项包含Id 0x010F(设备制造商)和Type 2(ASCII编码的字节数组)。代码示例显示该属性项的值。第二项表示设备型号。程序输出类似以下内容。
Property item 0
iD:0x10F
type:2
length:6 bytes
Property item 1
iD:0x110
The equipement makes is Canon PowerShot A570 IS
下面的示例在窗体上显示图像和图像的元数据。
Image image = new Bitmap(@"..\..\IMG_0445.jpg"); //产生图像对象
e.Graphics.DrawImage(image, 150, 10, 450, 310); //显示图像
PropertyItem[] propItems = image.PropertyItems; //得到图像PropertyItems数组
Font font = new Font("Arial", 12); //设置字体
SolidBrush blackBrush = new SolidBrush(Color.Black);
int X = 0;
int Y = 0;
int count = 0;
//对数组中的每一个PropertyItem属性项,显示ID和长度
foreach (PropertyItem propItem in propItems)
{
e.Graphics.DrawString( "Property Item " + count.ToString(),font, blackBrush, X, Y);
Y += font.Height;
e.Graphics.DrawString( " iD: 0x" + propItem.Id.ToString("x"), font, blackBrush, X, Y);
Y += font.Height;
e.Graphics.DrawString( " type: " + propItem.Type.ToString(), font, blackBrush, X, Y);
Y += font.Height;
e.Graphics.DrawString( " length: "+propItem.Len.ToString() + " bytes", font, blackBrush,X,Y);
Y += font.Height;
count++;
}
//变换第2个属性值为字符串并显示.
System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
string manufacturer = encoding.GetString(propItems[1].Value);
e.Graphics.DrawString( "The equipment make is " + manufacturer + ".", font, blackBrush, 150, 350);
输出如图所示,照片下方显示相机是Canon PowerShot A570 IS(佳能相机)
谢谢你的帮助