-
2020-12-26 15:48:25
目录
只能清除.JPG和.jpg格式结尾的照片信息。
1.1 效果演示
清除后的图片效果
清除速度
大量照片时1.2 完整源代码
环境说明:
win10、python3.7依赖:pip install piexif
from PIL import Image import piexif,os,time def setDate(photoAddress): mytime = str(time.strftime("%Y:%m:%d %H:%M:%S",time.localtime())) #固定格式 mytime = "2013:12:19 10:10:10" ,不能用time.strftime("%Y/%m/%d %H:%M:%S",time.localtime()) exif_ifd = { piexif.ExifIFD.DateTimeOriginal: mytime, piexif.ExifIFD.DateTimeDigitized: mytime, piexif.ExifIFD.CameraOwnerName:"ken" } exif_dict = {"Exif": exif_ifd} exif_bytes = piexif.dump(exif_dict) im = Image.open(photoAddress) im.save(photoAddress, exif=exif_bytes) def setMyInfo(photoAddress): im = Image.open(photoAddress) exif_dict = piexif.load(im.info["exif"]) exif_dict["0th"][piexif.ImageIFD.Artist] = "kenwanmao" exif_bytes = piexif.dump(exif_dict) # newfile = photoAddress im.save(photoAddress, exif=exif_bytes) def clearExif(path): startTime = time.time() countNums = 0 # os.walk() 方法用于通过在目录树中游走输出在目录中的文件名 for root, dirs, files in os.walk(path): for name in files: if name.endswith(".JPG") or name.endswith(".jpg"): photoAddress = os.path.join(root,name) print("{},已经被抹去exif信息。".format(photoAddress)) #调用piexif库的remove函数直接去除exif信息。 piexif.remove(photoAddress) countNums += 1 # setDate(photoAddress) # setMyInfo(photoAddress) print("本次程序共清除{}张JPG照片的Exif信息,耗时{:.2f} s".format(countNums,time.time() - startTime)) input("\n照片信息处理完毕,按任意键退出...") if __name__ == "__main__": print("欢迎使用EXIF信息清除程序!\n使用规则如下:") print("1.可以将本程序放在图片目录下点开使用") print("2.将照片目录手动输入\n") # 获取当前程序所在的目录 nowDir = str(os.getcwd()) photoDir = input("手动输入照片目录:") or nowDir #启动清除Exif信息函数 clearExif(photoDir)
1.3 参考博客
更多相关内容 -
照片详细信息修改器
2014-04-07 21:48:34专门修改图片的exif信息 exif不会产生“程序名称---***” exif同化 -
批量删除数码照片或手机中的相机参数和个人隐私信息
2022-04-26 09:18:38概要:当我们使用数码相机拍摄照片之后,其实照片文件的属性里面都包含了数码相机当时在拍摄照片时的一些参数信息,有些还包含了我们拍摄的地点的地理坐标信息,这些个人数据都是非常重要的隐私。这里给大家讲解一下...概要:当我们使用数码相机拍摄照片之后,其实照片文件的属性里面都包含了数码相机当时在拍摄照片时的一些参数信息,有些还包含了我们拍摄的地点的地理坐标信息,这些个人数据都是非常重要的隐私。这里给大家讲解一下一种简单的方法,去批量删除 Exif 个人隐私数据。
我们经常使用数码相机去拍摄照片,然后发到网上,但是大家不知道的是这些照片中都包含了个人的隐私信息,这里面包含了当时的相机参数信息,还有地理位置信息,如果把这些照片的原图发到网上去,很容易被一些有心人士利用这些信息来发现我们拍摄的位置,从而暴露了我们个人的隐私,这对于我们个人来说是非常不安全的。
那么有没有一种办法能批量的将这些图片的个人隐私的数据都删除掉了。其实这些数据在专业上来说就叫 Exif 元数据信息,那么现在就告诉大家如何通过两个步骤就可以批量的将这些元数据 Exif 信息全部的删除掉,这样的话我们就保证了我们所有的数据图片中都不会有这些个人数据信息了。
现在就给大家讲一下如何批量的清空数码相机照片中的 Exif 信息。我们可以通过这个简单的方法去批量删除元数据中的照相机制造商、照相机型号、光圈值、曝光时间、曝光补偿、焦距、最大光圈、镜头制造商、镜头型号、闪光灯制造商、闪光灯型号等等,还有地理位置这些数据,大家一定要仔细看一下下面的详细步骤。
首先打开「我的ABC软件工具箱」,然后进入到批量清空图片中的 Exif 信息的功能。我们通过这个功能来批量的删除和清空 Exif 信息:
在我们正式删除元数据之前,我们可以看一下我们处理前的图片中的个人隐私元数据信息,可以看到这些数据都是我们拍摄这张照片时的设置,我们不希望这些信息能够公布到网上,因此我们需要删除掉。
我们单击右上角添加我们需要批量删除隐私的所有图片,也就是说我们用数码相机,也包含手机拍摄完的照片都添加到这个列表中:
然后直接单击下一步软件就可以批量的将所有数码相机或手机照片的图片中的元数据个人隐私数据和地理位置数据都批量的删除掉了,大家可以看一下处理之后的效果:
有了这个批量删除图片元数据的方法,那我们以后再也不用担心我们的 exif 信息泄露到网上了。因此建议大家每次使用手机或数码相机拍摄完照片之后,我们一定要按照上面的步骤去批量的将这些图片中的个人隐私数据进行删除,然后再发到网上去。因此建议大家每次使用手机或数码相机拍摄完照片之后,我们一定要按照上面的步骤去批量的将这些图片中的个人隐私数据进行删除,然后再发到网上去。
-
html5点击图片弹出详细信息特效
2019-11-10 18:16:24html5点击图片弹出详细信息特效 -
如何在Photoshop中查看照片的EXIF信息如何删除照片的exif信息
2021-07-29 03:31:03如何删除照片exif信息EXIF信息答案: EXIF图片信息无法在ps中查看,您可以在计算机上直接查看它. 要在计算机上查看照片的EXIF信息,请执行以下操作: 工具/原材料计算机照相方法/步骤1.首先,右键单击需要查看EXIF信息...如何在Photoshop中查看照片的EXIF信息
问: 如何在Photoshop中查看照片?如何删除照片exif信息EXIF信息
答案: EXIF图片信息无法在ps中查看,您可以在计算机上直接查看它. 要在计算机上查看照片的EXIF信息,请执行以下操作: 工具/原材料计算机照相方法/步骤1.首先,右键单击需要查看EXIF信息的图像. 在弹出菜单中,单击“属性”选项. 2.弹出一个属性窗口,单击窗口顶部的“详细信息”. 3
如何查看和删除iPhone照片的Exif信息?
回答: 要在iPhone上查看,您需要在APP Store中下载特殊工具: ViewExif Exif信息对于新手和摄影师来说非常重要. 它可以告诉我们何时,何地以及何时完成这张照片. 什么参数,什么工具. ViewExif将查看Exif字母带到iOS本机照片应用程序和第三方应用程序
如何编辑照片exif信息
答案: 修改照片的EXIF信息的操作如下: 1.首先,百度搜索``MagicEXIF元数据编辑器''以下载并安装此小工具,如下图所示如何删除照片exif信息. 2.然后启动软件并单击“大眼睛”下方的按钮以打开需要修改EXIF数据的图像文件,如下所示. 3.打开图像后,单击下面的视图选项卡
如何删除图片中的拍摄时间
答案: 1.在照片属性中修改拍摄时间,这是与相机类型一起的信息,即EXIF信息. 您可以下载Acdsee8.0. 在Acdsee8.0中,您可以更改大量修改后的照片的EXIF信息. 单击/工具/批量设置EXIF信息,然后弹出一个窗口/您可以看到已设置照片的EXIF信息!
如果删除exif信息该怎么办,我可以再次添加这张图片
问: 如果我删除exif信息(如问题)(如在使用其他软件后还是删除),该怎么办?
答案: 右键单击图片,选择属性,打开属性对话框,然后单击详细信息以添加EXIF信息. 展开: 删除照片上的exif信息. 打开如何删除照片exif信息图片: 首先打开需要删除Exif信息的图片,右键单击并选择从Photoshop打开,请在操作前直接下载Photoshop软件,直接百度
如何查看图片exif的信息?
问: 我也在Internet上搜索了一些文档,但根据其他文档的操作,我的计算机显示不同
答案: 以Xiaomi Mobile 4为例: 1.启动智能手机系统,如图所示. 调用主用户界面,然后单击“微信”图标. 2.如图所示,调用“微信”应用程序界面. 选择下面的“发现”标签. 3.单击“小程序”图标. 4.调用“小程序”选项,如图所示. 点击右上角的“搜索”图标,输入“ E
在搜索文本框中
如何删除照片上的EXIF信息?
问: 我只是尝试了光影魔术手来处理照片. 如何删除照片的exif信息?然后稍后打开图像,找出我什么时候不知道照片
答案: 但是使用EXIF信息打印的照片以前已经保存过,但是现在无法取消.
如何获取照片的EXIF信息
答案: 使用PS删除Exif信息1,打开图片: 首先,我们打开需要删除Exif信息的图片exif是什么怎么删除,右键单击并选择从Photoshop中打开,请在此操作之前下载Photoshop软件,直接百度即可下载,在这里,我使用Photoshop CS6 2选择存储方式: 打开图片后,我们无需输入
如果删除图像exif信息会发生什么情况
答案: 情况不会很好. 图像的宽度和高度仍与原始图像相同,并且图像质量和清晰度不会改变. 文件大小与删除照片exif信息的方法相同. 只是我不知道照片的拍摄信息. 在某些电影比赛中,照片需要包含EXIF信息.
如何删除在照片exif中使用Photoshop的此信息?我只有
问: 如何删除照片EXIF中使用的PHOTOSHOP的此信息?我只是删除ps信息,其他e
答案: 在玩了很长时间的摄影后,我还没有找到单独删除它的方法. 我只能告诉您exif是什么怎么删除,不需要删除. 不要以为没有PS的照片就是带有内涵的真实照片,也不要担心以后会被别人嘲笑. 这是一个非常幼稚的误解. 照片只是用来表达您想要的. 只要您上看到效果
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/ruanjian/article-189591-1.html
-
一个直接用命令查看修改删除图片属性Exif信息的文件
2009-11-03 19:33:10其他软件必须对每一张照片的exif信息逐个删除,而现在只需要输入: jhead –purejpg *.jpg 就可以了! 4)-n(修改文件名为拍摄时间)指令中,格式-顺序参数非常灵活。例如添加“%f”就会保留原文件名的同时添加日期... -
PHP+ajax实现上传、删除、修改单张图片及后台处理逻辑操作详解
2020-10-15 16:06:28主要介绍了PHP+ajax实现上传、删除、修改单张图片及后台处理逻辑操作,结合实例形式详细分析了前台ajax提交图片上传、删除、修改以及后台PHP逻辑处理相关操作技巧与注意事项,需要的朋友可以参考下 -
VS修改可执行文件(.exe)的详细信息
2013-05-02 15:53:49利用vs修改可执行文件的详细信息。包括:应用程序的图标、文件的描述、文件说明、文件版本、产品版本、产品名称、版权等一些信息。 -
Java 项目 学生信息管理系统 超详细 超完整 保姆级讲解(主页面 + 添加学生信息 + 删除学生信息 +...
2021-11-30 13:17:20Java 学生信息管理系统 关注博主不迷路,博主带你码代码! 1. 项目概述 这是一个学生信息管理系统,学生信息主要包括:学号,姓名,性别,出生日期,班级;暂时就只有这些信息,若后续需要,可以相应的进行添加。...Java 学生信息管理系统
关注博主不迷路,博主带你码代码!
1. 项目概述
这是一个学生信息管理系统,学生信息主要包括:学号,姓名,性别,出生日期,班级;暂时就只有这些信息,若后续需要,可以相应的进行添加。
该项目主要采用的技术是 Java GUI 设计,这个地方主要用 Java 工具 windowsbuilder 进行布局,(windowsbuilder没有安装或者不会安装的,可以看看我的这篇博客 Eclipse 安装 windowbuilder插件 ),MySql 数据库(MySql 数据库没有安装的 或者数据库使用软件 Navicat 没有安装的可以看看我的这篇博客 2021 MySql 8.0.26 安装教程(最详细的傻瓜教程) ),以及使用 Java 中的 JDBC 将数据库链接起来。
2. 数据库的建立
由于在项目中没有创建学生数据库的功能,所以学生数据库必须要先建立好,下面给出如何建立好MySQL学生数据库的相关代码 + 图片
-- 创建数据库 CREATE DATABASE niit DEFAULT CHARACTER SET utf8mb4; SHOW DATABASES; -- 使用数据库niit USE niit; -- 创建表Student CREATE TABLE Student ( ID INT PRIMARY KEY, NAME VARCHAR(4), GENDER CHAR(1), DOB DATE, BATCH INT ); -- 插入记录 INSERT INTO Student VALUES (1,'独孤求败','男','1988-1-2',1), (2,'周芷若','女','1988-12-3',1), (3,'金毛狮王','男','1978-11-1',1), (4,'蒙挚','男','1989-2-5',2), (5,'夏春','女','1998-4-3',2), (6,'梅长苏','男','1999-12-6',2); -- 查看表中所有记录 语法:select * from 表名 SELECT * FROM Student;
3. 项目页面
主页面
添加学生
修改信息
删除学生
查询信息
4. 项目代码 + 分析
主页面
package studentsmanager; import java.awt.Color; import java.awt.EventQueue; import java.awt.Font; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; public class MainFrame extends JFrame { private JPanel contentPane; /** * Launch the application. */ // 有了main函数才可以单独运行 public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { MainFrame frame = new MainFrame(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public MainFrame() { // 设置大小不可改变 setResizable(false); // 设置标题 setTitle("学生管理系统"); // 由于这是主页面,所有当主页面关闭的时候,程序就直接退出 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // setBounds(int x,int y,int width,int height); // x 和 y 是窗口打开时的位置 // width 和 height 是窗口打宽度和高度 setBounds(100, 100, 450, 350); // setLocationRelativeTo(c) // 设置窗口相对于 c 的位置,当 c 为空或者 null 时,默认为是相对于屏幕中央 setLocationRelativeTo(null); // 实例化一个 pane contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(null); JLabel lblNewLabel = new JLabel("学生管理系统"); lblNewLabel.setForeground(Color.RED); lblNewLabel.setFont(new Font("宋体", Font.BOLD, 25)); lblNewLabel.setBounds(140, 10, 163, 44); contentPane.add(lblNewLabel); JButton addButton = new JButton("添加学生"); // addActionListener 注册监听器 addButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { // 设置新窗口可见 new AddFrame().setVisible(true); } }); addButton.setFont(new Font("宋体", Font.PLAIN, 18)); addButton.setBounds(167, 64, 114, 37); contentPane.add(addButton); JButton changeButton = new JButton("修改信息"); changeButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { // 同上 new ChangeFrame().setVisible(true); } }); changeButton.setFont(new Font("宋体", Font.PLAIN, 18)); changeButton.setBounds(167, 121, 114, 37); contentPane.add(changeButton); JButton deleteButton = new JButton("删除学生"); deleteButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { // 同上 new DeleteFrame().setVisible(true); } }); deleteButton.setFont(new Font("宋体", Font.PLAIN, 18)); deleteButton.setBounds(167, 180, 114, 37); contentPane.add(deleteButton); JButton queryButton = new JButton("查询信息"); queryButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { // 同上 new QueryFrame().setVisible(true); } }); queryButton.setFont(new Font("宋体", Font.PLAIN, 18)); queryButton.setBounds(167, 240, 114, 37); contentPane.add(queryButton); } }
添加学生
package studentsmanager; import java.awt.EventQueue; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.sql.SQLException; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.border.EmptyBorder; public class AddFrame extends JFrame { private JPanel contentPane; private JTextField idField; private JTextField nameField; private JTextField genderField; private JTextField dobField; private JTextField batchField; /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { AddFrame frame = new AddFrame(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public AddFrame() { // 和前面类似 setResizable(false); setTitle("添加学生"); // 这个地方,添加学生只是这个程序的一部分,所以当关闭这部分的时候,程序不直接退出,只是关闭该部分程序 setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); setBounds(100, 100, 450, 470); setLocationRelativeTo(null); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS)); JPanel panel = new JPanel(); contentPane.add(panel); panel.setLayout(null); JLabel TitleLabel = new JLabel("请输入新学生的信息:"); TitleLabel.setFont(new Font("宋体", Font.BOLD, 20)); TitleLabel.setBounds(71, 34, 208, 45); panel.add(TitleLabel); JLabel idLabel = new JLabel("学号:"); idLabel.setFont(new Font("宋体", Font.PLAIN, 16)); idLabel.setBounds(71, 105, 50, 30); panel.add(idLabel); idField = new JTextField(); idField.setBounds(143, 99, 240, 45); panel.add(idField); idField.setColumns(10); JLabel nameLabel = new JLabel("姓名:"); nameLabel.setFont(new Font("宋体", Font.PLAIN, 16)); nameLabel.setBounds(71, 160, 50, 30); panel.add(nameLabel); nameField = new JTextField(); nameField.setColumns(10); nameField.setBounds(143, 154, 240, 45); panel.add(nameField); JLabel genderLabel = new JLabel("性别:"); genderLabel.setFont(new Font("宋体", Font.PLAIN, 16)); genderLabel.setBounds(71, 215, 50, 30); panel.add(genderLabel); genderField = new JTextField(); genderField.setColumns(10); genderField.setBounds(143, 209, 240, 45); panel.add(genderField); JLabel dobLabel = new JLabel("出生日期:"); dobLabel.setFont(new Font("宋体", Font.PLAIN, 16)); dobLabel.setBounds(41, 270, 80, 30); panel.add(dobLabel); dobField = new JTextField(); dobField.setColumns(10); dobField.setBounds(143, 264, 240, 45); panel.add(dobField); JLabel batchLabel = new JLabel("班级:"); batchLabel.setFont(new Font("宋体", Font.PLAIN, 16)); batchLabel.setBounds(71, 325, 50, 30); panel.add(batchLabel); batchField = new JTextField(); batchField.setColumns(10); batchField.setBounds(143, 319, 240, 45); panel.add(batchField); JButton addButton = new JButton("添加"); // 添加鼠标监听事件 addButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { // 先取出数据 // getText() 返回字符串类型的 // Integer.parseInt 数据类型转换 int id = Integer.parseInt(idField.getText()); String nameString = nameField.getText(); String genderString = genderField.getText(); String dobfieldString = dobField.getText(); int batch = Integer.parseInt(batchField.getText()); // 输出一下学生的信息,方便修改 System.out.println(id + "\t" + nameString + "\t" + genderString + "\t" + dobfieldString + "\t" + batch); // SQLHelp 是自己写的一个工具类 SQLHelp sqlHelp = new SQLHelp(); try { // 调用添加学生信息的方法 sqlHelp.addStudent(id, nameString, genderString, dobfieldString, batch); // 弹出对话框,提示用户添加成功 JOptionPane.showMessageDialog(AddFrame.this, "添加成功!"); } catch (SQLException e1) { // 这里捕获一下异常,因为学生的学号是唯一的,所以当学号已经存在的时候,提示用户,该学生信息已存在 // 异常代码为 23000 if(e1.getSQLState().equals("23000")) { JOptionPane.showMessageDialog(AddFrame.this, "添加失败!该学生已存在"); } e1.printStackTrace(); } } }); addButton.setFont(new Font("宋体", Font.PLAIN, 18)); addButton.setBounds(182, 389, 97, 33); panel.add(addButton); } }
添加成功:
添加失败:
修改信息
package studentsmanager; import java.awt.EventQueue; import java.awt.Font; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.border.EmptyBorder; import java.awt.event.ActionListener; import java.sql.SQLException; import java.awt.event.ActionEvent; public class ChangeFrame extends JFrame { private JPanel contentPane; private JTextField idField; private JTextField nameField; private JTextField genderField; private JTextField dobField; private JTextField batchField; private JTextField searchField; /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { ChangeFrame frame = new ChangeFrame(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public ChangeFrame() { setResizable(false); setTitle("修改信息"); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); setBounds(100, 100, 450, 470); setLocationRelativeTo(null); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS)); JPanel panel = new JPanel(); contentPane.add(panel); panel.setLayout(null); JLabel lblNewLabel = new JLabel("请输入要修改的学生的学号:"); lblNewLabel.setFont(new Font("宋体", Font.PLAIN, 16)); lblNewLabel.setBounds(71, 0, 208, 29); panel.add(lblNewLabel); JLabel lblNewLabel_1 = new JLabel("学号:"); lblNewLabel_1.setFont(new Font("宋体", Font.PLAIN, 16)); lblNewLabel_1.setBounds(71, 105, 50, 30); panel.add(lblNewLabel_1); idField = new JTextField(); idField.setEditable(false); idField.setBounds(143, 99, 240, 45); panel.add(idField); idField.setColumns(10); JLabel lblNewLabel_1_1 = new JLabel("姓名:"); lblNewLabel_1_1.setFont(new Font("宋体", Font.PLAIN, 16)); lblNewLabel_1_1.setBounds(71, 160, 50, 30); panel.add(lblNewLabel_1_1); nameField = new JTextField(); nameField.setColumns(10); nameField.setBounds(143, 154, 240, 45); panel.add(nameField); JLabel lblNewLabel_1_1_1 = new JLabel("性别:"); lblNewLabel_1_1_1.setFont(new Font("宋体", Font.PLAIN, 16)); lblNewLabel_1_1_1.setBounds(71, 215, 50, 30); panel.add(lblNewLabel_1_1_1); genderField = new JTextField(); genderField.setColumns(10); genderField.setBounds(143, 209, 240, 45); panel.add(genderField); JLabel lblNewLabel_1_1_1_1 = new JLabel("出生日期:"); lblNewLabel_1_1_1_1.setFont(new Font("宋体", Font.PLAIN, 16)); lblNewLabel_1_1_1_1.setBounds(41, 270, 80, 30); panel.add(lblNewLabel_1_1_1_1); dobField = new JTextField(); dobField.setColumns(10); dobField.setBounds(143, 264, 240, 45); panel.add(dobField); JLabel lblNewLabel_1_1_1_2 = new JLabel("班级:"); lblNewLabel_1_1_1_2.setFont(new Font("宋体", Font.PLAIN, 16)); lblNewLabel_1_1_1_2.setBounds(71, 325, 50, 30); panel.add(lblNewLabel_1_1_1_2); batchField = new JTextField(); batchField.setColumns(10); batchField.setBounds(143, 319, 240, 45); panel.add(batchField); JButton changeButton = new JButton("修改"); changeButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { int id = Integer.parseInt(searchField.getText()); String nameString = nameField.getText(); String gendeString = genderField.getText(); String dobString = dobField.getText(); int batch = Integer.parseInt(batchField.getText()); SQLHelp sqlHelp = new SQLHelp(); try { sqlHelp.changeStudent(id, nameString, gendeString, dobString, batch); JOptionPane.showMessageDialog(ChangeFrame.this, "修改成功!"); } catch (SQLException e) { JOptionPane.showMessageDialog(ChangeFrame.this, "修改失败!"); e.printStackTrace(); } } }); changeButton.setFont(new Font("宋体", Font.PLAIN, 18)); changeButton.setBounds(182, 389, 97, 33); panel.add(changeButton); searchField = new JTextField(); searchField.setBounds(71, 39, 208, 45); panel.add(searchField); searchField.setColumns(10); JButton searchButton = new JButton("查找"); searchButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e){ int id = Integer.parseInt(searchField.getText()); try { SQLHelp sqlHelp = new SQLHelp(); Student student = sqlHelp.queryStudent(id); if(student != null) { // id 是直接读入的,所以就不需要从数据库中读出了 idField.setText(String.valueOf(id)); nameField.setText(student.getName()); genderField.setText(student.getGender()); dobField.setText(student.getDob()); batchField.setText(String.valueOf(student.getBatch())); } else { JOptionPane.showMessageDialog(ChangeFrame.this, "无此用户"); } } catch (SQLException e1) { e1.printStackTrace(); } } }); searchButton.setFont(new Font("宋体", Font.PLAIN, 18)); searchButton.setBounds(289, 42, 97, 39); panel.add(searchButton); } }
修改前查询到学生信息
修改成功
修改失败
失败的情况是数据链接出现了问题
未查询到学生信息
删除学生
package studentsmanager; import java.awt.EventQueue; import java.awt.Font; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.border.EmptyBorder; import java.awt.event.ActionListener; import java.sql.SQLException; import java.awt.event.ActionEvent; public class DeleteFrame extends JFrame { private JPanel contentPane; private JTextField idField; private JTextField nameField; private JTextField genderField; private JTextField dobField; private JTextField batchField; private JTextField searchField; /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { DeleteFrame frame = new DeleteFrame(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public DeleteFrame() { setResizable(false); setTitle("删除学生"); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); setBounds(100, 100, 450, 470); setLocationRelativeTo(null); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS)); JPanel panel = new JPanel(); contentPane.add(panel); panel.setLayout(null); JLabel lblNewLabel = new JLabel("请输入要删除的学生的学号:"); lblNewLabel.setFont(new Font("宋体", Font.PLAIN, 16)); lblNewLabel.setBounds(71, 0, 208, 29); panel.add(lblNewLabel); JLabel lblNewLabel_1 = new JLabel("学号:"); lblNewLabel_1.setFont(new Font("宋体", Font.PLAIN, 16)); lblNewLabel_1.setBounds(71, 105, 50, 30); panel.add(lblNewLabel_1); idField = new JTextField(); idField.setEditable(false); idField.setBounds(143, 99, 240, 45); panel.add(idField); idField.setColumns(10); JLabel lblNewLabel_1_1 = new JLabel("姓名:"); lblNewLabel_1_1.setFont(new Font("宋体", Font.PLAIN, 16)); lblNewLabel_1_1.setBounds(71, 160, 50, 30); panel.add(lblNewLabel_1_1); nameField = new JTextField(); nameField.setColumns(10); nameField.setBounds(143, 154, 240, 45); panel.add(nameField); JLabel lblNewLabel_1_1_1 = new JLabel("性别:"); lblNewLabel_1_1_1.setFont(new Font("宋体", Font.PLAIN, 16)); lblNewLabel_1_1_1.setBounds(71, 215, 50, 30); panel.add(lblNewLabel_1_1_1); genderField = new JTextField(); genderField.setColumns(10); genderField.setBounds(143, 209, 240, 45); panel.add(genderField); JLabel lblNewLabel_1_1_1_1 = new JLabel("出生日期:"); lblNewLabel_1_1_1_1.setFont(new Font("宋体", Font.PLAIN, 16)); lblNewLabel_1_1_1_1.setBounds(41, 270, 80, 30); panel.add(lblNewLabel_1_1_1_1); dobField = new JTextField(); dobField.setColumns(10); dobField.setBounds(143, 264, 240, 45); panel.add(dobField); JLabel lblNewLabel_1_1_1_2 = new JLabel("班级:"); lblNewLabel_1_1_1_2.setFont(new Font("宋体", Font.PLAIN, 16)); lblNewLabel_1_1_1_2.setBounds(71, 325, 50, 30); panel.add(lblNewLabel_1_1_1_2); batchField = new JTextField(); batchField.setColumns(10); batchField.setBounds(143, 319, 240, 45); panel.add(batchField); JButton deleteButton = new JButton("删除"); deleteButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { int id = Integer.parseInt(searchField.getText()); try { SQLHelp sqlHelp = new SQLHelp(); sqlHelp.deletestudent(id); JOptionPane.showMessageDialog(DeleteFrame.this, "删除成功!"); } catch (SQLException e1) { JOptionPane.showMessageDialog(DeleteFrame.this, "删除失败"); e1.printStackTrace(); } } }); deleteButton.setFont(new Font("宋体", Font.PLAIN, 18)); deleteButton.setBounds(182, 389, 97, 33); panel.add(deleteButton); searchField = new JTextField(); searchField.setBounds(71, 39, 208, 45); panel.add(searchField); searchField.setColumns(10); JButton searchButton = new JButton("查找"); searchButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { int id = Integer.parseInt(searchField.getText()); try { SQLHelp sqlHelp = new SQLHelp(); Student student = sqlHelp.queryStudent(id); if(student != null) { idField.setText(String.valueOf(id)); nameField.setText(student.getName()); genderField.setText(student.getGender()); dobField.setText(student.getDob()); batchField.setText(String.valueOf(student.getBatch())); } else { JOptionPane.showMessageDialog(DeleteFrame.this, "无此学生"); } } catch (SQLException e) { e.printStackTrace(); } } }); searchButton.setFont(new Font("宋体", Font.PLAIN, 18)); searchButton.setBounds(289, 42, 97, 39); panel.add(searchButton); } }
删除成功
删除失败
删除失败的时候是数据库链接出现了问题
查询到学生信息
未查询到学生
查询信息
package studentsmanager; import java.awt.EventQueue; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.sql.SQLException; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.border.EmptyBorder; public class QueryFrame extends JFrame { private JPanel contentPane; private JTextField idField; private JTextField nameField; private JTextField genderField; private JTextField dobField; private JTextField batchField; private JTextField searchField; /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { QueryFrame frame = new QueryFrame(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public QueryFrame() { setResizable(false); setTitle("查询信息"); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); setBounds(100, 100, 450, 470); setLocationRelativeTo(null); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS)); JPanel panel = new JPanel(); contentPane.add(panel); panel.setLayout(null); JLabel lblNewLabel = new JLabel("请输入要查找的学生的学号:"); lblNewLabel.setFont(new Font("宋体", Font.PLAIN, 16)); lblNewLabel.setBounds(71, 0, 208, 29); panel.add(lblNewLabel); JLabel lblNewLabel_1 = new JLabel("学号:"); lblNewLabel_1.setFont(new Font("宋体", Font.PLAIN, 16)); lblNewLabel_1.setBounds(71, 105, 50, 30); panel.add(lblNewLabel_1); idField = new JTextField(); idField.setEditable(false); idField.setBounds(143, 99, 240, 45); panel.add(idField); idField.setColumns(10); JLabel lblNewLabel_1_1 = new JLabel("姓名:"); lblNewLabel_1_1.setFont(new Font("宋体", Font.PLAIN, 16)); lblNewLabel_1_1.setBounds(71, 160, 50, 30); panel.add(lblNewLabel_1_1); nameField = new JTextField(); nameField.setColumns(10); nameField.setBounds(143, 154, 240, 45); panel.add(nameField); JLabel lblNewLabel_1_1_1 = new JLabel("性别:"); lblNewLabel_1_1_1.setFont(new Font("宋体", Font.PLAIN, 16)); lblNewLabel_1_1_1.setBounds(71, 215, 50, 30); panel.add(lblNewLabel_1_1_1); genderField = new JTextField(); genderField.setColumns(10); genderField.setBounds(143, 209, 240, 45); panel.add(genderField); JLabel lblNewLabel_1_1_1_1 = new JLabel("出生日期:"); lblNewLabel_1_1_1_1.setFont(new Font("宋体", Font.PLAIN, 16)); lblNewLabel_1_1_1_1.setBounds(41, 270, 80, 30); panel.add(lblNewLabel_1_1_1_1); dobField = new JTextField(); dobField.setColumns(10); dobField.setBounds(143, 264, 240, 45); panel.add(dobField); JLabel lblNewLabel_1_1_1_2 = new JLabel("班级:"); lblNewLabel_1_1_1_2.setFont(new Font("宋体", Font.PLAIN, 16)); lblNewLabel_1_1_1_2.setBounds(71, 325, 50, 30); panel.add(lblNewLabel_1_1_1_2); batchField = new JTextField(); batchField.setColumns(10); batchField.setBounds(143, 319, 240, 45); panel.add(batchField); searchField = new JTextField(); searchField.setBounds(71, 39, 208, 45); panel.add(searchField); searchField.setColumns(10); JButton searchButton = new JButton("查找"); searchButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { // 1.读出要查询的学生输入的id // 因为学生的学号是唯一的,所以我们根据学号查询后,只会有一条数据 // 转化一下数据类型 int id = Integer.parseInt(searchField.getText()); // 2.执行JDBC语句 try { SQLHelp sqlHelp = new SQLHelp(); Student student = sqlHelp.queryStudent(id); // 3.将查询结果填到文本框中 // 前提是学生存在 if(student != null) { idField.setText(String.valueOf(id)); nameField.setText(student.getName()); genderField.setText(student.getGender()); dobField.setText(student.getDob()); batchField.setText(String.valueOf(student.getBatch())); } else { // 此时学生不存在,提示用户,不存在该学生 JOptionPane.showMessageDialog(QueryFrame.this, "无此学生"); } } catch (SQLException e) { e.printStackTrace(); } } }); searchButton.setFont(new Font("宋体", Font.PLAIN, 18)); searchButton.setBounds(289, 42, 97, 39); panel.add(searchButton); } }
SQLHelp 工具类
package studentsmanager; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class SQLHelp { public static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver"; public static final String DB_URL = "jdbc:mysql://localhost:3306/niit?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC"; public static final String username = "root"; public static final String password = "011216"; private Connection connection = null; private PreparedStatement pStatement = null; private ResultSet rSet = null; // 加载驱动 // 静态初始化块(只执行一次) static { try { Class.forName(JDBC_DRIVER); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } // 链接数据库 public void connectDB() { try { connection = DriverManager.getConnection(DB_URL,username,password); System.out.println("数据库链接成功"); } catch (SQLException e) { System.out.println("数据库链接失败"); e.printStackTrace(); } } // 关闭资源 public void close() { if(rSet != null) { try { rSet.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(pStatement != null) { try { pStatement.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(connection != null) { try { connection.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public void addStudent(int id, String nameString, String genderString, String dobString, int batch) throws SQLException { // try finally 无论是否抛出异常都将执行 finally 中的语句 try { // 先链接到数据库 connectDB(); // sql 语句 // 静态 sql 语句需要进行字符串拼接 // 动态 sql 语句 String addsql = "insert into student values(?, ?, ?, ?, ?)"; pStatement = connection.prepareStatement(addsql); pStatement.setInt(1, id); pStatement.setString(2, nameString); pStatement.setString(3, genderString); pStatement.setString(4, dobString); pStatement.setInt(5, batch); pStatement.executeUpdate(); } finally { close(); } } public void changeStudent(int id, String nameString, String genderString, String dobString, int batch) throws SQLException { try { connectDB(); String changesql = "update student set name = ?, gender = ?, dob = ?, batch = ? where id = ?"; pStatement = connection.prepareStatement(changesql); pStatement.setString(1, nameString); pStatement.setString(2, genderString); pStatement.setString(3, dobString); pStatement.setInt(4, batch); pStatement.setInt(5, id); pStatement.executeUpdate(); } finally { close(); } } public void deletestudent(int id) throws SQLException { try { connectDB(); String deleteString = "select * from student where id = ?"; pStatement = connection.prepareStatement(deleteString); pStatement.setInt(1, id); pStatement.execute(); } finally { close(); } } public Student queryStudent(int id) throws SQLException { try { connectDB(); String querysql = "select * from student where id = ?"; pStatement = connection.prepareStatement(querysql); pStatement.setInt(1, id); // 三种方法执行 // execute() 都可以使用,返回true或false // executeQuery() 专门用于查询,返回结果集 // executeUpdate() 专门用于删除、更新 rSet = pStatement.executeQuery(); if(rSet.next()) { String nameString = rSet.getString(2); String genderString = rSet.getString(3); String dobString = rSet.getString(4); int batchString = rSet.getInt(5); // 查询到学生信息返回结果集 return new Student(nameString, genderString, dobString, batchString); } else { // 没有查询到学生信息,返回null return null; } } finally { close(); } } }
Student 工具类
package studentsmanager; public class Student { private String name; private String gender; private String dob; private int batch; public Student(String name, String gender, String dob, int batch) { this.name = name; this.gender = gender; this.dob = dob; this.batch = batch; } public String getName() { return name; } public String getGender() { return gender; } public String getDob() { return dob; } public int getBatch() { return batch; } }
5. 项目总结
这算一个比较完整的项目了,既有 GUI 又有 MySQL 数据库的已经 Java 的 JDBC ,虽然已经有了 GUI 界面,但很明显,没有进行任何美化,就只是简单的一个界面,勉勉强强可以看的过去,使用 JDBC 链接数据库的时候,没有实现可以直接在程序创建数据库,只能从数据库方创建数据库,这是一个缺点,同时使用 JDBC 链接数据库的时候,所使用的代码依旧是 MySQL 数据库的代码,(我 MySQL 学的不好,增删改查啥的数据库代码都还记不清楚 哭了…)还有就是当程序在进行修改和删除的时候,修改失败和删除失败的时候,都是因为数据链接失败了才进行弹窗,不知道怎么改成无法修改或者无法删除的时候提示,(又哭了…)
欢迎个位大佬指出错误,同时也欢迎各位小白借鉴,有问题的话,评论或者私聊都是可以的,看了就会回复!
-
Java 项目 学生信息管理系统 超详细 超完整 保姆级讲解(主页面 + 添加学生信息 + 删除学生信息 + 修改学生...
2021-11-27 20:29:57Java 学生信息管理系统1. 项目概述2. 数据库的建立3. 项目页面4. 项目代码 + 分析5. 项目总结 关注博主不迷路,博主带你码代码! 1. 项目概述 这是一个学生信息管理系统,学生信息主要包括:学号,姓名,性别,出生... -
文本框删除,wps怎么删除文本框
2021-07-30 05:31:47一、文本框没选中导致删不了 因为很多人选中的文本框不是文本框而是里面的文字或者图片,比如下图这样的,你可以看到如果你选中的是里面的文字的话,会在后面跟一个光标,这样的说明你选中的不是文本框,所以删除的... -
批量删除 Word 文档中的所有图片
2022-04-12 10:08:43我们每天都在处理很多 Word 文件,有时候老板让我们将所有的 Word 文件里面的所有图片都删除掉,但是我们不可能手工一个一个的去删除这些 Word 文档中的图片。因为如果 Word 文件太多了,那么我们手工删除这些图片的... -
超酷相册鼠标经过显示详细信息并可以添加删除
2012-06-14 18:18:55超酷相册鼠标经过显示详细信息并可以添加删除 -
exif信息中的数据_什么是EXIF数据,如何将其从照片中删除?
2020-09-08 22:31:07exif信息中的数据A photo’s EXIF data contains a ton of information about your camera, and potentially where the picture was taken (GPS coordinates). That means, if you’re sharing images, there’s a ... -
用 Windows Media Player 在线匹配歌曲文件的专辑图片,音乐信息等并写入歌曲文件
2019-08-29 15:14:00如何用 Windows Media Player 在线匹配歌曲文件的专辑图片,音乐信息等并写入歌曲文件 相信大家都遇到过这样一个问题,自己下载的歌曲文件名和歌曲内部的信息(标题、艺术家、唱片集等)杂乱无章或者<未知>,... -
excel怎么快速删除整个表格所有图片
2021-08-31 19:29:541.打开要删除图片的Excel表格 2.点击DIY工具箱(Excel工具箱,百度即可了解详细下载安装信息,本文这里就不做详细解说。) 3.选择【图片】 4.点击【删除图片】 5.勾选【当前表】 ... -
如何修改PDF文件以及如何删除一页
2021-07-27 02:57:43然后,要修改PDF文件,您需要使用PDF编辑软件,然后,如何修改PDF文件,如何删除一页,估计很多小朋友想知道应该怎么做,那么您可以看看下面的文章,也许您会知道.1. 打开并运行快速PDF编辑器,然后在编辑器中打开... -
一个基于SpringBoot+vue的学生信息管理系统详细设计
2021-11-30 23:23:29学生教师管理:录入数据、添加、修改、删除、查询等 添加老师信息: 学生管理:录入数据、添加、修改、删除、查询等 添加学生信息: 班级管理:添加、修改、删除、查询等 课程管理:添加、修改、删除、查询等 添加... -
JDBC案例(上):商品信息的查询 、商品信息的添加、 商品信息的删除 、商品信息的更新
2018-10-12 11:40:02//调用dao层的代码,从数据库中删除商品信息 ProductDao dao = new ProductDao(); boolean flag = dao.deleteProduct(pid); return flag; } 在ProductDao中添加一个方法deleteProduct(String pid),用于... -
C#使用EXIF读取图片信息(很受用哦!)
2010-12-05 16:00:28EXIF 读取照片的详细信息! 一:动态读取图片详细信息 二:对图片的信息进行处理输出! -
【最新版】PhotoSweeper_X.dmg 3.6.2【亲测可用】最好的帮助您在Mac上查找和删除重复的照片和类似的照片
2020-04-03 14:00:39PhotoSweeper将显示照片的所有详细信息,并将重复的照片移至Aperture废纸rash。 与最新的Capture One 11和较旧的Capture One版本一起著名地工作。删除后,照片将进入特殊相册。 Adobe Lightroom 适用于Lightroom... -
MySQL记录删除后竟能按中间被删除的主键加回去,磁盘空间被重用!——底层揭秘MySQL行格式记录头信息
2021-06-14 14:15:02当Mysql记录被删除,页中记录存储结构如何变化?当删除的记录再次被插入,页中记录存储结构如何变化?本篇讲解记录头信息的底层原理和计算,让你从原理理解它! -
python 通过图片(原图)精确获取图片拍摄的位置,时间,设备等信息
2019-10-15 19:31:11想要悄悄的获取某人的位置,只需...获取拍摄照片的经纬度,时间,设备信息。这里使用的照片需是拍摄的原图,图片路径本文是放在了与运行程序相同的文件夹。实现代码如下: import exifread # 获取照片位置 cl... -
基于Java+Springmvc+vue+element员工信息管理系统详细设计
2022-05-06 08:09:06功能主要有首页、个人中心、员工管理、企业部门管理、年度考勤管理、每日考勤管理、请假信息管理、工资信息管理、调动信息管理、管理员管理等。 员工所能使用的功能主要有首页、个人中心、企业部门管理、年度考勤... -
基于element-ui 使用 upload 预览图片(含删除功能)
2019-08-23 12:11:32我们都知道 upload 是上传文件的组件,但同时可以对上传文件进行预览,这里我才用 upload 预览图片。 首先介绍的是list-type:文件列表的类型,可选值:text | picture | picture-card ,默认值为 text. file-list... -
java获取视频详细信息并截图做封面的两种实现方式
2020-07-09 11:38:23java获取视频详细信息(宽、高、大小、时长、格式)并截图做封面。 以及maven依赖与jar包下载 链接在最后,0积分免费下载 本文介绍两种实现方式:1jave,2javaCV.... -
Avue的upload数组图片上传以及删除后上传又出现的问题
2020-12-29 15:23:01注意坑:按理说我们点击删除一个图片就剩下一个,然后上传一个又变成两个了,结果不是你们想的那样,删除一个,上传一个,结果是三个,删除的没有真正的删除,你们可以去Avue官网去看看这个坑 看坑链接 1.删除 2.... -
短消息删除了能恢复吗
2021-08-10 02:22:12短消息删除了能恢复,恢复的方法:1、运营商服务器调取短信内容很多人都以为手机短信删除之后无法恢复,其实短信中的信息会被保存在各大运营的省级服务器中,存储周期一年。内容包括:收取的短信内容和发送的短信... -
python获取照片EXIF信息(拍摄地址、拍摄时间、经纬度等)
2020-02-26 21:27:46EXIF信息 可交换图像文件格式(英语:Exchangeable image file format,官方简称Exif),是专门为数码相机的照片设定...这个信息是相当详细了。只要是拍摄的照片都有这个信息,所以这个信息也是有泄露个人隐私的风险... -
PowerApps教程07-记录的详细信息显示
2021-01-09 22:13:58前面的教程有教大家如何显示记录集,但是一直都没有提到如何查看记录的详细信息,以及如何编辑、删除、新建记录,那么今天我们就先来讲讲如何查看记录的详细信息。 二、目的 我们先看一下之前创建的界面/屏幕,就是...