C#实现给图片添加日期信息的示例详解
作者:芝麻粒儿 发布时间:2021-07-29 21:19:28
标签: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();
}
}
}
来源:https://zhima.blog.csdn.net/article/details/128102195


猜你喜欢
- 本文实例讲述了java使用Jdom实现xml文件写入操作的方法。分享给大家供大家参考,具体如下:package com.yanek.demo
- 迪杰斯特拉算法迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算
- 在android中做图像镜像有很多方法,今天算是学习了! 两种方法如下: //方法一 Matrix matrix = new Matrix(
- 一、概述1.1 什么是Java工厂模式Java工厂模式是一种创建对象的设计模式,它提供了一种方法,通过该方法可以在不暴露对象创建逻辑的情况下
- 一、maven项目的目录结构pom文件定于了一个maven项目的maven配置,一般pom文件的放在项目或者模块的根目录下。maven的遵循
- java StringBuilder类的详解及简单实例实现代码:public class StringBuilder
- 一.OO(面向对象)的设计基础面向对象(OO):就是基于对象概念,以对象为中心,以类和继承为构造机制,充分利用接口和多态提供灵活性,来认识、
- LocationMarker是运动轨迹上Start、End, 以及整公里点上笔者自定义绘制的一个MarkerView, 当时之所以没有用设计
- 这里的万年历制作主要用到了Calendar类和GregorianCalendar类,我们先来回顾一下基础知识:基础部分一、Cal
- 1.使用API设置主题如下所示,在Activity中使用setThemesetTheme(R.style.MyTheme1);2.调用API
- 1.情景展示将要访问的接口地址等常用的配置添加到properties文件中,比直接写到java类中的好处在于:当我们需要修改相应配置时,直接
- 假设目录结构是maven标准结构-src-target-test.jar(你需要更新的jar包)package com.foo.common
- SpringMVC 中,文件的上传,是通过 MultipartResolver 实现的。 所以,如果要实现文件的上传,只要在 spring-
- C# 关于Invoke首先说下,invoke和begininvoke的使用有两种情况:control中的invoke、begininvoke
- 前几天在“Android绘图之渐隐动画”一文中通过画线实现了渐隐动画,但里面有个问题,画笔较粗(大于1)时线段之间会有裂隙,我又改进了一下。
- 整合Spring Data JPAJPA (Java Persistence API)和 Spring Data 是两个范畴的概念。Hibe
- 开篇:我们将前面的springboot整合H2内存数据库,实现单元测试与数据库无关性提供的Restful服务注册到spring cloud的
- 本文实例为大家分享了C#绘制饼状图和柱状图的具体代码,供大家参考,具体内容如下#代码如下:using System;using System
- C# 7 里面的Pattern Mathing 更多内容请查看官方文档:https://docs.microsoft.com/zh-cn/d
- 1.什么是逆向工程mybaits需要程序员自己编写sql语句,mybatis官方提供逆向工程 可以针对单表自动生成mybatis执行所需要的