C# 获取图片照相机信息

1 篇文章 0 订阅

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;
        }

 

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值