`
metaphy
  • 浏览: 339039 次
  • 性别: Icon_minigender_1
  • 来自: 大西洋底
社区版块
存档分类
最新评论

统一批量修改照片名字

 
阅读更多
在给小宝拍的照片中,有我手机拍的,有媳妇手机拍的,还有相机拍的,于是每个月给小宝选的30张照片中,文件命名很乱。现在根据文件修改属性,统一按时间戳命名,精确到秒。


程序如下:
(程序规模小,因此未考虑潜在的重名问题)
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;

public class UpdateFileName {
	private static final String dir = "C:/Documents and Settings/Administrator/My Documents/My Pictures/dir/";

	public static void updateName() {
		File fdir = new File(dir);
		File[] list = fdir.listFiles();
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH.mm.ss");
		
		for (File f : list) {
			if (f.isFile() && f.getName().toUpperCase().endsWith(".JPG")) {
				Date date = new Date(f.lastModified());
				String newName = sdf.format(date);
				
				System.out.print(f.getName() + "\t");
				System.out.println(newName + ".jpg");

				f.renameTo(new File(dir + newName + ".jpg"));
			}
		}
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		updateName();
	}
}



即使就是今天,还是遇到了同名的问题,可见,作为一个合格而严谨的代码工,一定不能心存任何侥幸。程序更新如下,对于同一秒拍摄的照片,使用毫秒级的时间戳加6位随机整数来命名,以此解决上面程序的同名问题:
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Random;

public class UpdateFileName {
	private static final String PROCESS_DIR = "C:/Documents and Settings/Administrator/My Documents/My Pictures/dir/";
	private static final Random RANDOM = new Random();
	
	/**
	 * update the picture file names
	 */
	public static void updateName() {
		File fdir = new File(PROCESS_DIR);
		File[] list = fdir.listFiles();
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH.mm.ss");
		
		// 需要考虑重名文件问题
		HashMap<String, Integer> fileAllNames = new HashMap<String, Integer>();
		SimpleDateFormat sdfAnother = new SimpleDateFormat("yyyy-MM-dd HH.mm.ss.SSS");
		
		for (File f : list) {
			if (f.isFile() && f.getName().toUpperCase().endsWith(".JPG")) {
				Date date = new Date(f.lastModified());
				String newName = sdf.format(date);
				
				if (fileAllNames.containsKey(newName) ){ // 有重名的
					newName = sdfAnother.format(date);
					int rint = RANDOM.nextInt(999999-100000+1)+100000 ; // get a number between [a,b]
					newName = newName + "."+ String.valueOf(rint);
				}
				
				fileAllNames.put(newName, 1);
				
				System.out.print(f.getName() + "\t\t\t");
				System.out.println(newName + ".jpg");

				boolean succeed = f.renameTo(new File(PROCESS_DIR + newName + ".jpg"));
				
				if (!succeed) {
					System.err.println("Rename failed: New File Name - " + newName);
				}
			}
		}
	}
	 

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		updateName();
	}
}


-------------------------------------------------------
程序再次更新,源于变态的apple使用iTunes导出文件,导致modified date time跟拍摄时间不一致。下面程序读取Exif信息做为拍摄时间,需要导入外部JAR包 metadata-extractor-2.4.0-beta-1.jar


import java.io.File;
import java.util.HashMap;
import java.util.Random;

import com.drew.imaging.jpeg.JpegMetadataReader;
import com.drew.imaging.jpeg.JpegProcessingException;
import com.drew.metadata.Directory;
import com.drew.metadata.Metadata;
import com.drew.metadata.MetadataException;
import com.drew.metadata.exif.ExifDirectory;

public class UpdateJPGNameWithTimeStamp {
	private static final String PROCESS_DIR = "C:/Users/IBM_ADMIN/Pictures/11/";
	private static final Random RANDOM = new Random();
	private static String model = "";

	public static String findEXIFDateTime(File jpegFile) {
		Metadata metadata;
		try {
			metadata = JpegMetadataReader.readMetadata(jpegFile);
			Directory exif = metadata.getDirectory(ExifDirectory.class);
			String newname = exif
					.getDescription(ExifDirectory.TAG_DATETIME_ORIGINAL);
			// System.out.println(newname);
			if (newname!=null && newname.contains(":")){
				newname = newname.replaceFirst(":", "-");
				newname = newname.replaceFirst(":", "-");
				newname = newname.replaceFirst(":", ".");
				newname = newname.replaceFirst(":", ".");
				newname = newname.replaceFirst(":", ".");
			}
			model = exif.getDescription(ExifDirectory.TAG_MODEL);
			// System.out.println(exif.getDescription(ExifDirectory.TAG_EXIF_VERSION));
			return newname;
		} catch (JpegProcessingException e) {
			e.printStackTrace();
		} catch (MetadataException e) {
			e.printStackTrace();
		}

		return null;
	}

	public static void updateAll() {
		File fdir = new File(PROCESS_DIR);
		File[] list = fdir.listFiles();
		// 需要考虑重名文件问题
		HashMap<String, Integer> fileAllNames = new HashMap<String, Integer>();

		for (File f : list) {
			if (f.isFile() && f.getName().toUpperCase().endsWith(".JPG")) {
				String newName = findEXIFDateTime(f);
				
				if (newName == null || newName.equals("")) {
					continue;
				}
				
				if (fileAllNames.containsKey(newName + ".jpg")) { // 有重名的
					int rint = RANDOM.nextInt(999999 - 100000 + 1) + 100000;
					newName = newName + "." + String.valueOf(rint);
				}
				
				newName = newName + ".jpg";
				fileAllNames.put(newName, 1);

				System.out.print("Old name: " + f.getName() + "\t");
				System.out.print("New name: " + newName + "\t");
				System.out.println("by " + model);

				boolean succeed = f.renameTo(new File(PROCESS_DIR + newName));

				if (!succeed) {
					System.err.println("Rename failed: New File Name - "
							+ newName);
				}
			}
		}
		System.out.println("Done! Totally updated " + fileAllNames.keySet().size() );
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		UpdateJPGNameWithTimeStamp.updateAll();
	}
}
0
1
分享到:
评论

相关推荐

    基于python实现图片批量处理器统一添加水印,修改名字等功能实现源码

    然后对水印文字或者图片进行设置,接下来设置水印的透明度和位置,单击“路径设置”区域的“浏览”按钮,对水印图片的保存路径进行设置,全部设置完成后,单击“执行”按钮,即可批量为选择的图片添加文字或者图片...

    一键批量文件、照片改名,改后缀名

    一键批量改文件或照片改名或后缀名,快速方便,自动解决命名冲突

    基于python实现图片批量处理器统一添加水印,修改名字等功能实现源码分享

    然后对水印文字或者图片进行设置,接下来设置水印的透明度和位置,单击“路径设置”区域的“浏览”按钮,对水印图片的保存路径进行设置,全部设置完成后,单击“执行”按钮,即可批量为选择的图片添加文字或者图片...

    批量改名添加修改时间.bat

    处理照片的时候,想改成统一名字,可以把本bat文件放到照片目录下,一键执行。 批处理结果是,所以文件名字前面加上修改时间后缀,方便查看: 例如: 修改前:纸鹤.jpg 修改前:20211102+纸鹤.jpg

    MapGIS扫描件批量改名

    MapGIS扫描件批量改名工具 行政代码+宗地号+000+$权调表#+*.jpg 使用时双击选中图片的上一级的上一级的文件夹即可(图片的上一级文件应该为宗地号)。

    前后端一键修改名字replace name.rar

    一键更改统一文件名前后缀,包括img图片名统一风格等

    修改文件夹下图片的名字

    python3 实现同一个文件夹下图片统一命名,如将dh67hc.jpg , hdha89.jpg修改为dog.0.jpg , dog.1.jpg……

    java实现批量改文件夹、文件名的shell

    由于自己经常利用浏览器插件下载网页图片,由此产生很多的文件夹和文件,这些文件夹的名字多半是网页的title,导致文件夹名很长,文件名多是些很长的数。感觉这样的状况不是很好就自己用java实现了简单的shell来管理...

    快速截小图,统一重命名,统一调整规格,快速识别

    选择工具-&gt;统一大图大小即可选择要处理图片的文件夹路径,批量对图片统一 到(1240×1754)大小; 5.选择工具-&gt;大图批量重命名即可选择要处理图片的文件夹路径,批量对图片进 行重命名图片并把不合格图片更改格式...

    机智图片管理系统 v1.0.rar

    3.图片名字尽量不要重名,特殊符号,或过长! 批量上传: 1.此功能可以在浏览时选择多选图片,选择打开,等待列表显示,然后点上传所有文件即可! 2.最小尺寸建议140*140. 3.图片名字尽量不要重名,特殊符号,或过长! 4....

    node文件批量重命名的方法示例

    需要批量修改文件名称,变为统一前缀名称并且自增索引,修改后效果 最简单的人力操作就是逐个文件重命名,但本着DRY(Don’t repeat yourself)原则,还是写一个node脚本搞定。 研究 node中要进行文件操作需要了解...

    机智图片管理系统 1.0

    3.图片名字尽量不要重名,特殊符号,或过长! 批量上传: 1.此功能可以在浏览时选择多选图片,选择打开,等待列表显示,然后点上传所有文件即可! 2.最小尺寸建议140*140. 3.图片名字尽量不要重名,特殊符号,或过长! 4....

    1.8版格格团优站新版完整版(带数据库)

    站点名称 站点地址 客服旺旺 帮派地址 appkey secretkey 完整PID LOGO地址 标题包含名字 微淘图片 底部LOGO图片 关注主页地址 分享U站图片 18 商品排序列功能 商品设置排序ID可以指定商品排在哪个位置 默认按添加...

    1.8新版格格团程序+采集器组合

    站点名称、站点地址、客服旺旺、帮派地址、appkey、secretkey、完整PID、LOGO地址、标题包含名字、微淘图片、底部LOGO图片、关注主页地址、分享U站图片 18、商品排序列功能 商品设置排序ID可以指定商品排在哪个位置...

    淘宝优站程序 淘牛品优站源码 自定义优站程序

    站点名称、站点地址、客服旺旺、帮派地址、appkey、secretkey、完整PID、LOGO地址、标题包含名字、微淘图片、底部LOGO图片、关注主页地址、分享U站图片 18、诊断商品 点击诊断商品按钮将站内推广期内的商品商品...

    格格团U站源码淘宝优站

    站点名称、站点地址、客服旺旺、帮派地址、appkey、secretkey、完整PID、LOGO地址、标题包含名字、微淘图片、底部LOGO图片、关注主页地址、分享U站图片 18、诊断商品 点击诊断商品按钮将站内推广期内的商品商品...

    深度学习(asp)网址导航系统 3.1.2(最新更新完美版)

    1、将整个目录上传到虚拟空间,即可直接访问 index.asp 首页文件(不可以将index.asp改成其它的名字,否则系统跳转出错),不需要做其他的操作。 2、后台登陆文件“admin/deep_login.asp”,可任意更改管理目录名...

    asoft签到管理系统tykq3.5_build20110125

    1、增加自定义用户组名称功能,现在您可以自由的为所有权限的用户取一个您喜欢的名字了(更改后用户下一次登录系统将会显示新的权限名称。例如,将“数据员”改为“秘书”等) 2、调整登陆页面设计。暂时屏蔽日程...

Global site tag (gtag.js) - Google Analytics