C#实现给图片添加日期信息的示例详解

 更新时间:2022年12月09日 15:44:59   作者:芝麻粒儿  
这篇文章主要为大家详细介绍了如何利用C#实现给图片添加日期信息,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以了解一下

实践过程

效果

代码

 public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public string flag = null;
        PropertyItem[] pi;
        string TakePicDateTime;
        int SpaceLocation;
        string pdt;
        string ptm;
        Bitmap Pic;
        Graphics g;
        Thread td;

        private void button5_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string[] IMG;
            listBox1.Items.Clear();
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                IMG = openFileDialog1.FileNames;
                if (IMG.Length > 0)
                {
                    for (int i = 0; i < IMG.Length; i++)
                    {
                        listBox1.Items.Add(IMG[i]);
                    }
                }

                flag = IMG.Length.ToString();
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            listBox1.Items.Clear();
            flag = null;
        }

        private void button3_Click(object sender, EventArgs e)
        {
            if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
            {
                txtSavePath.Text = folderBrowserDialog1.SelectedPath;
            }
        }

        private void button4_Click(object sender, EventArgs e)
        {
            if (flag == null || txtSavePath.Text == "")
            {
                return;
            }
            else
            {
                toolStripProgressBar1.Visible = true;
                td = new Thread(new ThreadStart(AddDate));
                td.Start();
            }
        }

        private void AddDate()
        {
            Font normalContentFont = new Font("宋体", 36, FontStyle.Bold);
            Color normalContentColor = Color.Red;
            int kk = 1;
            toolStripProgressBar1.Maximum = listBox1.Items.Count;
            toolStripProgressBar1.Minimum = 1;
            toolStripStatusLabel1.Text = "开始添加数码相片拍摄日期";
            for (int i = 0; i < listBox1.Items.Count; i++)
            {
                pi = GetExif(listBox1.Items[i].ToString());
                //获取元数据中的拍照日期时间,以字符串形式保存
                TakePicDateTime = GetDateTime(pi);
                //分析字符串分别保存拍照日期和时间的标准格式
                SpaceLocation = TakePicDateTime.IndexOf(" ");
                pdt = TakePicDateTime.Substring(0, SpaceLocation);
                pdt = pdt.Replace(":", "-");
                ptm = TakePicDateTime.Substring(SpaceLocation + 1, TakePicDateTime.Length - SpaceLocation - 2);
                TakePicDateTime = pdt + " " + ptm;
                //由列表中的文件创建内存位图对象
                Pic = new Bitmap(listBox1.Items[i].ToString());
                //由位图对象创建Graphics对象的实例
                g = Graphics.FromImage(Pic);
                //绘制数码照片的日期/时间
                g.DrawString(TakePicDateTime, normalContentFont, new SolidBrush(normalContentColor),
                    Pic.Width - 700, Pic.Height - 200);
                //将添加日期/时间戳后的图像进行保存
                if (txtSavePath.Text.Length == 3)
                {
                    Pic.Save(txtSavePath.Text + Path.GetFileName(listBox1.Items[i].ToString()));
                }
                else
                {
                    Pic.Save(txtSavePath.Text + "\\" + Path.GetFileName(listBox1.Items[i].ToString()));
                }

                //释放内存位图对象
                Pic.Dispose();
                toolStripProgressBar1.Value = kk;
                if (kk == listBox1.Items.Count)
                {
                    toolStripStatusLabel1.Text = "全部数码相片拍摄日期添加成功";
                    toolStripProgressBar1.Visible = false;
                    flag = null;
                    listBox1.Items.Clear();
                }

                kk++;
            }
        }

        #region 获取数码相片的拍摄日期

        //获取图像文件的所有元数据属性,保存倒PropertyItem数组
        public static PropertyItem[] GetExif(string fileName)
        {
            FileStream Mystream = new FileStream(fileName, FileMode.Open, FileAccess.Read);
            //通过指定的数据流来创建Image
            Image image = Image.FromStream(Mystream, true, false);
            return image.PropertyItems;
        }

        //遍历所有元数据,获取拍照日期/时间
        private string GetDateTime(System.Drawing.Imaging.PropertyItem[] parr)
        {
            Encoding ascii = Encoding.ASCII;
            //遍历图像文件元数据,检索所有属性
            foreach (PropertyItem pp in parr)
            {
                //如果是PropertyTagDateTime,则返回该属性所对应的值
                if (pp.Id == 0x0132)
                {
                    return ascii.GetString(pp.Value);
                }
            }

            //若没有相关的EXIF信息则返回N/A
            return "N/A";
        }

        #endregion

        private void Form1_Load(object sender, EventArgs e)
        {
            CheckForIllegalCrossThreadCalls = false;
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            if (td != null)
            {
                td.Abort();
            }
        }
    }

到此这篇关于C#实现给图片添加日期信息的示例详解的文章就介绍到这了,更多相关C#图片添加日期信息内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C# String常用函数的使用详解

    C# String常用函数的使用详解

    这篇文章主要介绍了C# String常用函数的使用详解,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下
    2021-04-04
  • C#制作多线程处理强化版网络爬虫

    C#制作多线程处理强化版网络爬虫

    这篇文章主要介绍了C#制作多线程处理强化版网络爬虫的相关代码,有想学习C#多线程编程的小伙伴可以参考下
    2016-09-09
  • C# 使用PrintDocument类打印标签的方法

    C# 使用PrintDocument类打印标签的方法

    本文介绍打印机初步配置,以及实现方法,标签主要展示资产基本信息以及二维码,对C# 使用PrintDocument类打印标签的详细过程感兴趣的朋友一起看看吧
    2022-04-04
  • C#实现排列组合算法完整实例

    C#实现排列组合算法完整实例

    这篇文章主要介绍了C#实现排列组合算法的完整实例,文中实例主要展示了排列循环方法和排列堆栈方法,需要的朋友可以参考下
    2014-09-09
  • C#中类与结构的区别实例分析

    C#中类与结构的区别实例分析

    这篇文章主要介绍了C#中类与结构的区别,类与结构是C#初学者比较轻易混淆的概念,本文加以实例说明,需要的朋友可以参考下
    2014-08-08
  • C#实现MQTT服务端与客户端通讯功能

    C#实现MQTT服务端与客户端通讯功能

    这篇文章介绍了C#实现MQTT服务端与客户端通讯的功能,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-01-01
  • C#中常见的数据缓存方式汇总

    C#中常见的数据缓存方式汇总

    在C#开发中,数据缓存是一种优化应用程序性能的常见技术,合理的缓存策略可以减少对数据源的访问次数,提高数据处理速度,从而改善用户体验,下面将详细介绍几种在C#中常见的数据缓存方式,以及相应的实例,需要的朋友可以参考下
    2024-05-05
  • WinForm 自动完成控件实例代码简析

    WinForm 自动完成控件实例代码简析

    在Web的应用方面有js的插件实现自动完成(或叫智能提示)功能,但在WinForm窗体应用方面就没那么好了,接下来参考一下这个实例,看看有没有以外收获,感兴趣的朋友可以了解下啊,希望本文对你有帮助啊
    2013-01-01
  • 详解C#中的Async和Await用法

    详解C#中的Async和Await用法

    这篇文章主要介绍了C#中的Async和Await用法,包括在C#5.0下一些新特性的影响,需要的朋友可以参考下
    2015-07-07
  • Unity UGUI的ContentSizeFitter内容尺寸适应器组件使用示例

    Unity UGUI的ContentSizeFitter内容尺寸适应器组件使用示例

    这篇文章主要为大家介绍了Unity UGUI的ContentSizeFitter内容尺寸适应器组件使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08

最新评论