jueves, 19 de febrero de 2009

Ordenar mis fotos por carpetas

Siempre he tenido un serio problema a la hora de organizar las fotografías en mi disco duro. Al principio volcaba todo en una misma carpeta, cosa que en cuestión de pocas descargas de la cámara, convertía la carpeta en algo totalmente invisitable. El segundo paso fue el crear carpetas con nombres descriptivos y guardar en ellas las fotografías, pero aún así la cosa era un infierno.

Las aplicaciones como Picasa, ACD See, PhotoMesa permiten gestionar bastante bien las fotografías, pero a mi, como buen usuario proviniente del MS-DOS al que le gusta saber dónde están las cosas en mi disco duro, y no perder el control sobre él, no acababan de convencerme.

Tras una breve incursión en el mundo del Linux, descubrí la aplicación f-Spot, que realizaba una clasificación en carpetas de las fotografías en función de los datos Exif de los archivos JPG.

Ya de vuelta al mundo Windows, y tras decantarme por Picasa, principalmente por su facilidad de uso (no para mi, sino para mi mujer), me encontré con mi eterno problema de clasificar las fotografías. Por lo que en ese momento me decidí a crear mi propio programita Java que clasifique en carpetas las fotografías a partir de sus datos Exif.

Lo primero de todo es obtener las fotografías de origen a partir de una ruta:

/*
* Por CNG (www.trapallada.com).
*/

/**
* Devuelve una colección con todos los ficheros JPG de una carpeta.
* Para obtener esa colección recorre recursivamente todo el árbol de
* directorios bajo la carpeta indicada.
* @param f File indicando la carpeta en la que realizar la búsqueda recursiva.
* @return Una Colección con todos los ficheros baja la carpeta pasada al método.
*/
private static Collection getFiles( File f ) {
Collection c = new ArrayList();
if ( f.isDirectory() ) {
File[] listOfFiles = f.listFiles();
for (int i = 0; i < listOfFiles.length; i++) {
c.addAll( getFiles( listOfFiles[i]) );
}
} else {
JFileChooser chooser = new JFileChooser();
if ( chooser.getTypeDescription(f).equals("Archivo JPG") ) c.add(f);
}
return c;
}

A partir de la colección de ficheros JPG, y mediante la librería metadata-extractor, yo he usado la versión 2.3.1, podemos generar un nuevo nombre de fichero y mover el archivo original de la colección obtenida a su destino definitivo.

// Por CNG (www.trapallada.com).
try {
String salida = "D:/Mis documentos/Mis imágenes/preImportado";
String entrada = "D:/CarpetaOrigen";

Collection files = getFiles( new File(entrada) );

Iterator itFiles = files.iterator();
while ( itFiles.hasNext() ) {
File ficheroJpg = (File) itFiles.next();
try {
Metadata metadata = JpegMetadataReader.readMetadata( ficheroJpg );
Directory exif = metadata.getDirectory( Class.forName("com.drew.metadata.exif.ExifDirectory") );

Calendar fecha = Calendar.getInstance();
try {
fecha.setTime( exif.getDate( ExifDirectory.TAG_DATETIME_ORIGINAL ) );
File toFile = new File( salida + "/" + fecha.get( Calendar.YEAR ) + "-" +
Formateador.fill( new Integer( fecha.get( Calendar.MONTH ) + 1 ).toString(),
'0', 2, Formateador.IZQUIERDA ) + "/" +
ficheroJpg.getName() );
Ficheros.moveFile( ficheroJpg, toFile);
}
catch ( MetadataException j ) {
System.out.println("ERROR: " + ficheroJpg.getName() );
}
} catch ( JpegProcessingException e ) {
e.printStackTrace();
}
}
}
catch ( Exception e )
{
e.printStackTrace();
}
}

Nota: El método Formateador.fill tiene el siguiente javadoc:
/**
* M&amp;amp;amp;amp;eacute;todo que devuelve la cadena rellena con el caracter "caracterRelleno", hasta
* ocupar "longitud" posiciones, desde el lado indicado.
*
* @param cadena: Cadena a ser formateada
* @param caracterRelleno: Caracter con el que se va a rellenar
* @param longitud: Indica la longitud de la cadena resultante
* @param lado: nos indica en que lado situar los caracteres de Relleno
* @return Cadena rellena
*/
Nota 2: No creo que haga falta explicar lo que hace el método Ficheros.moveFile.

No hay comentarios:

Publicar un comentario