C# 获取图片照相机信息
设备制造商、设备型号、拍照时间、曝光时间、光圈值、ISO、焦距值
代码:
private void btnSelectImg1_Click(object sender, EventArgs e)
{
string str = SelectImg();
if (str != "")
{
txtImg1.Text = str;
pbImg1.BackgroundImage = GetImage(str);
List<string> list = GetImageInfo(str, pbImg1.BackgroundImage);
txtMsg.Clear();
foreach (var item in list)
{
txtMsg.AppendText("\n"+item);
}
}
}
private List<string> GetImageInfo(string path,Image image)
{
List<string> list = new List<string>();
PropertyItem[] pt = image.PropertyItems;
for (int i = 0; i < pt.Length; i++)
{
PropertyItem p = pt[i];
switch (pt[i].Id)
{ // 设备制造商 20.
case 0x010F:
{
string str = System.Text.ASCIIEncoding.ASCII.GetString(pt[i].Value);
list.Add("设备制造商:" + str);
}
break;
case 0x0110: // 设备型号 25.
{
string str = GetValueOfType2(p.Value);
list.Add("设备型号:" + str);
}
break;
case 0x0132: // 拍照时间 30.
{
string str = GetValueOfType2(p.Value);
list.Add("拍照时间:" + str);
}
break;
case 0x829A: // .曝光时间
{
string str = GetValueOfType5(p.Value);
list.Add("曝光时间:" + str);
}
break;
case 0x8827: // ISO 40.
{
string str = GetValueOfType3(p.Value);
list.Add("ISO:" + str);
}
break;
case 0x010E: // 图像说明info.description
{
string str = GetValueOfType2(p.Value);
list.Add("图像说明:" + str);
}
break;
case 0x920a: //相片的焦距
{
string str = GetValueOfType5A(p.Value) + " mm";
list.Add("焦距值:" + str);
}
break;
case 0x829D: //相片的光圈值
{
string str = GetValueOfType5A(p.Value);
list.Add("光圈值:" + str);
}
break;
default:
{
}
break;
}
}
return list;
}
public string GetValueOfType2(byte[] b)// 对type=2 的value值进行读取
{
return System.Text.Encoding.ASCII.GetString(b);
}
private static string GetValueOfType3(byte[] b) //对type=3 的value值进行读取
{
if (b.Length != 2) return "unknow";
return Convert.ToUInt16(b[1] << 8 | b[0]).ToString();
}
private static string GetValueOfType5(byte[] b) //对type=5 的value值进行读取
{
if (b.Length != 8) return "unknow";
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() + " sec";
}
private static string GetValueOfType5A(byte[] b)//获取光圈的值
{
if (b.Length != 8) return "unknow";
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]);
double temp = (double)fm / fz;
return (temp).ToString();
}
public string SelectImg()
{
OpenFileDialog openFi = new OpenFileDialog();
openFi.Filter = "图像文件(JPeg, Gif, Bmp, etc.)|*.jpg;*.jpeg;*.gif;*.bmp;*.tif; *.tiff; *.png| JPeg 图像文件(*.jpg;*.jpeg)"
+ "|*.jpg;*.jpeg |GIF 图像文件(*.gif)|*.gif |BMP图像文件(*.bmp)|*.bmp|Tiff图像文件(*.tif;*.tiff)|*.tif;*.tiff|Png图像文件(*.png)"
+ "| *.png |所有文件(*.*)|*.*";
if (openFi.ShowDialog() == DialogResult.OK)
{
return openFi.FileName;
}
return "";
}
/// <summary>
/// 用内存流来读取图片
/// </summary>
/// <param name="filePath"></param>
/// <returns></returns>
public static Image GetImage(string filePath)
{
Image image = null;
try
{
//实例化一个文件流
using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
//把文件读取到字节数组
byte[] data = new byte[fs.Length];
fs.Read(data, 0, data.Length);
image = Image.FromStream(new MemoryStream(data));
fs.Close();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
return image;
}