Zum Inhalt

Monat: Juni 2014

Fotos mit Zeitstempel umbenennen

Mit den folgenden paar Zeilen Java Code lassen sich Fotos bequemen umbenennen, d.h. der Dateiname wird noch mit dem Zeitstempel aus den Exif Daten ergänzt. Möglich macht das das Framework metadata-extractor.

/*
 * Created on 28.06.2014
 */
package de.denniswilmsmann.renamephotos;

import java.io.File;
import java.io.IOException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import com.drew.imaging.ImageMetadataReader;
import com.drew.imaging.ImageProcessingException;
import com.drew.metadata.Metadata;
import com.drew.metadata.exif.ExifSubIFDDirectory;

/*
 * $Log: $
 */
public class RenamePhotos {

  private final DateFormat df = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.LONG);
  private final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_HHmmss");

  public static void main(String[] args) {
    File folder = new File("D:\\PhotosToRename\\");

    RenamePhotos ex = new RenamePhotos();
    ex.parse(folder);
  }

  private void parse(File f) {
    if (f.isDirectory()) {
      parseDirectory(f);
    } else {
      parseFile(f);
    }
  }

  private void parseDirectory(File f) {
    for (File file : f.listFiles()) {
      if (file.isDirectory()) {
        parseDirectory(file);
      } else {
        parseFile(file);
      }
    }
  }

  private void parseFile(File f) {
    try {
      if (f.isFile() && isRenameRequired(f)) {
        Metadata metadata = ImageMetadataReader.readMetadata(f);
        ExifSubIFDDirectory directory = metadata.getDirectory(ExifSubIFDDirectory.class);
        Date date = directory.getDate(ExifSubIFDDirectory.TAG_DATETIME_ORIGINAL);

        String newName = sdf.format(date) + "_" + f.getName();
        System.out.println(f.getName() + " -> " + newName);

        f.renameTo(new File(f.getParent() + "\\" + newName));
      } else {
        System.out.println("skip " + f.getAbsolutePath());
      }
    } catch (ImageProcessingException e) {
      System.out.println("error parsing " + f.getAbsolutePath());
    } catch (IOException e) {
      System.out.println("error parsing " + f.getAbsolutePath());
    } catch (NullPointerException e) {
      System.out.println("error parsing " + f.getAbsolutePath());
    }
  }

  private boolean isRenameRequired(File f) {
    StringBuffer sb = new StringBuffer();
    for (int i = 0; i < f.getName().length(); i++) {
      sb.append(f.getName().charAt(i));
      try {
        sdf.parse(sb.toString());
        return false;
      } catch (ParseException e) {
        // ignore
      }

    }
    return true;
  }
}

Und dazu noch die passsende pom.xml, damit die Dependencies einfach via maven geladen werden können:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>RenamePhotos</groupId>
	<artifactId>RenamePhotos</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<build>
		<plugins>
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.1</version>
				<configuration>
					<source>1.6</source>
					<target>1.6</target>
				</configuration>
			</plugin>
		</plugins>
	</build>
	<dependencies>
		<dependency>
			<groupId>com.drewnoakes</groupId>
			<artifactId>metadata-extractor</artifactId>
			<version>2.6.2</version>
		</dependency>
	</dependencies>
</project>

Hier die Dateien vorher:
renamephotos1

Und nachher:
renamephotos2

Die Ausgabe auf der Konsole sieht dazu so aus:

CIMG2773.JPG -> 2012-02-23_172829_CIMG2773.JPG
CIMG2774.JPG -> 2012-02-23_172842_CIMG2774.JPG
CIMG2775.JPG -> 2012-02-23_172847_CIMG2775.JPG
CIMG2776.JPG -> 2012-02-23_172853_CIMG2776.JPG
CIMG2777.JPG -> 2012-02-23_184732_CIMG2777.JPG
CIMG2778.JPG -> 2012-02-23_184746_CIMG2778.JPG
CIMG2779.JPG -> 2012-02-23_184752_CIMG2779.JPG
CIMG2780.JPG -> 2012-02-23_211635_CIMG2780.JPG
CIMG2781.JPG -> 2012-02-23_211646_CIMG2781.JPG
CIMG2782.JPG -> 2012-02-23_211655_CIMG2782.JPG
CIMG2783.JPG -> 2012-02-23_211714_CIMG2783.JPG
CIMG2784.JPG -> 2012-02-23_211724_CIMG2784.JPG
CIMG2785.JPG -> 2012-02-23_211735_CIMG2785.JPG
CIMG2786.JPG -> 2012-02-23_211745_CIMG2786.JPG
CIMG2787.JPG -> 2012-02-23_211801_CIMG2787.JPG
CIMG2788.JPG -> 2012-02-23_211810_CIMG2788.JPG
CIMG2789.JPG -> 2012-02-23_211822_CIMG2789.JPG
error parsing D:\PhotosToRename\desktop.ini

Der Code Style für den eclipse Java Formatter stammt von Google: https://google-styleguide.googlecode.com/svn/trunk/eclipse-java-google-style.xml

Ach ja, es gibt natürlich auch diverse kleine Tools, die das auch alles können, z.B. ExifRenamer für Mac OS oder dieses Tool für Windows.