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
0
投稿
猜你喜欢
- 这篇文章主要介绍了springboot跨域CORS处理代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,
- 参考文章图解Java中插入排序算法的原理与实现实现效果示例代码import java.awt.*;public class AlgoVisu
- 若一个实例方法声明前带有virtual关键字,那么这个方法就是虚方法。虚方法与非虚方法的最大不同是,虚方法的实现可以由派生类所取代,这种取代
- 实例描述现有某班学生的两份成绩,两份成绩中存在一些不一致的记录。需借助于编程方法找出这些不一致的记录。实例代码using System;us
- java获取系统路径字体、得到某个目录下的所有文件名、获取当前路径package com.liuxing.test;import java.
- 一、背景我们都知道 http 协议只能浏览器单方面向服务器发起请求获得响应,服务器不能主动向浏览器推送消息。想要实现浏览器的主动推送有两种主
- 如何调试Java程序?大家最开始学习Java,都会觉得IDE调试好高端有木有,其实很简单了。下文会尽量简单直观的教会你在Eclipse中调试
- 前言下面大部分内容来源于网上的相关帖子和官网,自己简单写了个demo体验了下,个人感觉mybatis的缓存并不是很合适查询做缓存时,遇到更新
- 项目结构:运行效果:========================================================下面是代
- 见过一句夸张的话,叫做“没有阅读过jdk源码的人不算学过java”。从今天起开始精读源码。而适合精读的源码无非就是java.io,.util
- 条件:1、android:ellipsize=”marquee”2、TextView必须单行显示,即内容必须超出TextView
- 因为项目需要,需要在一个之前没做过springBoot项目的eclipse上跑一个springBoot项目并完成打包,所以就在网上查完资料以
- Intellij Idea打包Java项目打开模块设置如下图所示,选中需要打包的模块,右键点击,即会出现如下图所示的内容,点击Open Mo
- 获取e.printStackTrace()打印的信息某些情况下,我们需要获取应用打印的异常信息,这时就可以借助StringWriter和Pr
- 说道线程,肯定会想到使用 java.lang.Thread.java这个类那么创建线程也主要有2种方式第一种方式:public class
- 1. 前言现在很多应用都有小悬浮窗的功能,比如看直播的时候,通过Home键返回桌面,直播的小窗口仍可以在屏幕上显示。下面将介绍下悬浮窗的的一
- 一、前言上一篇文章中我们已经Spring Boot 利用注解方式整合 MyBatis,今天我们就来看看,如何利
- java 中Spark中将对象序列化存储到hdfs摘要: Spark应用中经常会遇到这样一个需求: 需要将JAVA对象序列化并存储到HDFS
- 在springmvc中controller的结果集可通过json格式传到js前端接受,也可以通过Map传给前端,具体实现如下1,通过json
- 1、数组理论基础数组是存放在连续内存空间上的相同类型数据的集合,可以通过下标索引的方式获取到下标下对应的数据。举个栗子(字符数组)~可以看到