`
metaphy
  • 浏览: 345509 次
  • 性别: 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
分享到:
评论

相关推荐

    批量修改照片名字工具 有需要直接下载

    总结来说,批量修改照片名字工具是针对需要批量整理照片命名的用户设计的,能够有效地对大量jpg格式的图片进行快速重命名,提升工作效率。用户在下载并运行.exe程序后,应参考Readme文件来了解具体使用方法。

    批量修改文件名软件

    批量修改文件名的能力可以极大地提高效率,避免手动更改每一个文件的繁琐过程。本文将深入探讨批量修改文件名的软件及其工作原理,以及如何利用这样的工具来优化文件管理。 批量修改文件名软件是一种专门设计用于...

    批量更改文件名字

    在日常的计算机操作中,有时我们需要对大量的文件进行统一的命名修改,比如整理照片、归档文档等。这时,批量更改文件名字的功能就显得尤为重要。批量改名可以帮助我们节省大量手动操作的时间,提高工作效率,尤其在...

    批量修改图片照片文件名小工具好用

    "批量修改图片照片文件名小工具"正是为解决这个问题而设计的实用软件。 批量修改图片文件名的功能在于能够高效地自动化文件重命名过程。通过指定规则,如添加前缀、后缀或者按照特定模式(如日期、编号)来重新命名...

    批量修改名字

    2. **文件预览**:在进行批量修改前,一个好的工具会提供预览功能,让用户在实际修改前看到即将更改的文件名,这样可以避免误改重要文件。 3. **命名模式**:批量修改工具通常允许用户选择不同的命名模式,如数字...

    批量更改文件名 替换文件名 批量智能命名文件

    在日常的计算机操作中,有时我们需要对大量的文件进行统一的命名操作,比如批量更改文件名、替换文件名或采用批量智能命名方式。这样的需求在处理照片、文档、音乐等大量文件时尤为常见,能有效提高工作效率。下面...

    批量修改文件名软件(含教程).zip

    首先,批量修改文件名是指通过一个自动化工具或程序,一次性对多个文件进行命名规则的更改,而不是逐一手动操作。这在处理大量具有相似命名模式的文件时尤其有用,比如照片、文档或者音乐库等。批量操作可以是删除...

    推荐一个批量修改文件名的小软件

    如果网站中的许多文件名需要更改,批量修改文件名工具可以快速完成这项任务,避免了逐个文件打开和修改的繁琐步骤。 批量修改文件名的软件通常包含以下特性: 1. **多种命名规则**:支持预设的命名规则,如数字递增...

    文件名批量修改器

    "文件名批量修改器"就是为了解决这个问题而设计的工具。它允许用户按照自己的需求,快速、高效地修改多个文件的名称,避免了手动操作带来的繁琐和耗时。 批量文件名修改器的核心功能在于其自定义命名规则的能力。...

    批量修改文件名2.73

    "批量修改文件名2.73"是一款专为此目的设计的软件,它允许用户一次性对多个文件进行命名操作,节省了手动逐个更改的繁琐过程。 批量更名软件的核心功能包括但不限于以下几点: 1. **模板化命名**:用户可以设定一...

    批量修改照片大小、裁剪图片的小软件

    标题提到的“批量修改照片大小、裁剪图片的小软件”是一种实用的工具,它能帮助用户快速地调整照片尺寸、进行裁剪以及其他可能的图像处理操作。描述中的“好的照片批量处理工具”进一步强调了软件的高效性和易用性。...

    jpg批量修改为淘宝tbi图片扩展名的批处理

    了解以上知识后,你就可以根据需要创建自己的批处理脚本来进行文件扩展名的批量修改了。在实际应用中,批处理脚本还可以结合其他命令进行更复杂的操作,如文件查找、复制、删除等,灵活度非常高。在进行此类操作时,...

    Win7系统中一键完成批量改照片名字.docx

    在Windows 7操作系统中,管理和组织大量的照片文件可以变得相当简单,尤其是当你需要批量更改照片文件的名字时。这个系统内置的功能使得用户无需依赖第三方软件就能有效地整理和命名照片。以下是如何在Windows 7中...

    批量文件名修改

    批量文件名修改是指对一组文件进行统一的命名规则更改,例如将所有文件的名字前面加上日期、序列号,或者替换掉某些特定字符。这种功能通常被用在整理下载的文件、照片库管理、项目文档归档等场景。要实现批量文件名...

    数码照片批量处理工具 .rar

    7. 批量裁剪:统一裁剪照片至特定比例或尺寸。 8. 添加边框或特效:应用预设的边框样式或滤镜效果。 9. 生成缩略图:快速创建一组缩略图,便于预览和展示。 总的来说,“数码照片批量处理工具 .rar”提供了一个全面...

    批量修改文件名

    4. 预览更改后的文件名,确认无误后执行批量修改操作。 总的来说,批量修改文件名是提高文件管理效率的一个利器,尤其对于那些需要处理大量文件的用户而言。通过这款名为"refilesname"的应用,即使是对电脑操作不太...

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

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

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

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

    批量修改图片尺寸,添加水印工具

    批量添加水印确保所有图片统一展示公司的标志或摄影师的名字,同时不影响图片的主要内容。 4. **软件工具**: ImageConverterOne可能是用于批量处理图片的工具,它可能提供了用户友好的界面,允许用户设置参数,如...

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

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

Global site tag (gtag.js) - Google Analytics