Wildness: procesando por lotes con dcraw para Windows
El primer contacto con dcraw suele echar para atrás por tratarse de una aplicación de línea de comandos, lo cual parece contradictorio tratándose de una aplicación para fotografía digital. Sin embargo, uno de los aspectos más útiles de que sea una aplicación de este tipo es que es posible usarlo para pasar a JPEG o TIFF un lote de fotos raw sin dedicar apenas un segundo.
El problema hasta ahora era que, en entorno Windows, solo la versión más lenta, la compilada con MingW, permitía el uso de comodines. Pues bien, hoy os presento una pequeña utilidad propia que pretende, no solo incorporar esa funcionalidad a las versiones compiladas con Microsoft Visual C++ (MSVC) e Intel C++, sino incluso ir más allá de la funcionalidad proporcionada por la versión MingW, soportando complejas rutas relativas y búsqueda recursiva.
He llamado a esta aplicación Wildness[1] y su uso no puede ser más sencillo.
Instrucciones
Descargamos la aplicación desde este enlace:
Si no lo tenéis instalado necesitaréis el .NET Framework 3.5, que podéis descargar desde este otro enlace:
Renombráis vuestro dcraw.exe como _dcraw.exe y extraéis el archivo dentro del .zip, wildness.exe, en el mismo directorio en el que teneís el dcraw y lo renombráis como dcraw.exe.
A partir de ese momento podéis llamar a dcraw (idealmente ponedlo en el path de Windows para poder llamarlo desde cualquier carpeta) con comodines, rutas relativas y búsqueda recursiva. El único cuidado que debéis tener es que la cadena de búsqueda con comodines (o el nombre del archivo que queráis revelar si no usáis comodines) sea el último parámetro, o el penúltimo si queréis búsqueda recursiva, en cuyo caso el último parámetro deberá ser /r.
Ejemplo de uso
dcraw -v -a -T -6 -q 3 -o 1 ......rawsboda*.dng /r
Y dcraw convertirá todos los DNGs de la carpeta especificada y subcarpetas a un TIFF de 16 bits sRGB, balance de blancos automático e interpolación AHD. Si usáis mis versiones optimizadas de dcraw el proceso será aún más rápido.
En realidad la aplicación se puede usar con cualquier otro ejecutable al que queráis incorporar la funcionalidad de uso de comodines, no solo a dcraw.
Código fuente
// To the extent possible under law, Manuel Llorens <manuelllorens@gmail.com>
// has waived all copyright and related or neighboring rights to this work.
// This code is licensed under CC0 v1.0, see license information at
// http://creativecommons.org/publicdomain/zero/1.0/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Diagnostics;
namespace wildness
{
class Program
{
static void ShowInfo()
{
Console.WriteLine("Wildness 1.0. www.rawness.es");
Console.WriteLine("nUsage:nFor example, if you want to use this program to call dcraw.exe using wildcards, you should do the following:nndcraw.exe -> _dcraw.exenwildness.exe -> dcraw.exennThen call dcraw as usual, but using wildcars. You can specify \r as last parameter for directory recursion. Enjoy.");
}
static void Main(string[] args)
{
String[] arguments = Environment.GetCommandLineArgs();
String OriAppName = "_" + Path.GetFileNameWithoutExtension(arguments[0]) + ".exe";
if (args.Length > 0)
{
String Params = "";
int p = 1;
if((arguments[arguments.Length-1]=="/r")||(arguments[arguments.Length-1]=="/R")) p++;
for (int i = 1; i < arguments.Length - p; i++)
Params += arguments[i] + ' ';
string searchPattern = Path.GetFileName(arguments[arguments.Length - p]);
string searchPath= Path.GetDirectoryName(arguments[arguments.Length - p]);
if (searchPath.Length == 0) searchPath = ".";
DirectoryInfo di = new DirectoryInfo(searchPath);
try
{
FileInfo[] files;
String path;
if(p==1)
files=di.GetFiles(searchPattern, SearchOption.TopDirectoryOnly);
else
files=di.GetFiles(searchPattern, SearchOption.AllDirectories);
foreach (FileInfo file in files)
{
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.EnableRaisingEvents = false;
proc.StartInfo.FileName = OriAppName;
proc.StartInfo.WorkingDirectory = Environment.CurrentDirectory;
proc.StartInfo.CreateNoWindow = false;
proc.StartInfo.UseShellExecute = false;
path="";
if (searchPath.Length > 1)
path+=searchPath + "\";
if(file.Directory.Name.Length>0)
path+=file.Directory.Name+"\";
path+=file.Name;
if (path.IndexOf(" ") > 0)
path=""" + path +""";
proc.StartInfo.Arguments = Params + path;
try
{
proc.Start();
proc.WaitForExit();
}
catch (Exception e)
{
Console.WriteLine("ERROR: " + OriAppName + " has not been found.");
return;
}
}
}
catch (Exception e)
{
Console.WriteLine("The specified path does not exist.");
return;
}
}
else
{
if (File.Exists(OriAppName))
{
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.EnableRaisingEvents = false;
proc.StartInfo.FileName = OriAppName;
proc.StartInfo.WorkingDirectory = Environment.CurrentDirectory;
proc.StartInfo.CreateNoWindow = false;
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.Arguments = "";
try
{
proc.Start();
proc.WaitForExit();
}
catch (Exception e)
{
Console.WriteLine("Wildness 1.0. www.rawness.es");
Console.WriteLine("ERROR: " + OriAppName + " has not been found.");
return;
}
}else
ShowInfo();
}
}
}
}
- [1] Aunque la etimología es bastante evidente, especialmente para los lectores angloparlantes, lo cierto es que es al mismo tiempo un pequeño homenaje a la excelente Into the Wild, de Sean Penn. ↩
Related posts:

Tengo que echarle un vistazo al código porque, como se dice en algunos comentarios, no parece funcionar bien en todas las versiones de Windows. Lo que pasa es que no encuentro el rato.
Cuando lo haga intentaré actualizar el artículo para que el uso sea lo más simple posible.
Comentario by Manuel Llorens García — 25 noviembre, 2010 - 22:41
Hola Manuel,
Despues de dar infinidad de vueltas con el tema de los comodines en Win 7 y no ver la salida al tunel, en el ultimo cursillo dado por Guillermo hizo conocer tu web y donde misrar para solucionar el tema, yo de informatica sabia que entendia muy poco, pero una vez leido el articulo de como poder realizar el cambio, verdaderamente me doy cuenta que no es que entienda poco, realmente no tengo ni idea, no se si habra alguna forma de poder explicarlo de modo que los ignorantes en el tema podamos solucionarlo paso a paso, de todas formas si hubiera que realizar algo extenso entenderia el no ponerlo. Gracias por la pagina ya que la encuentro muy interesante, creo que a partir de ahora intentare estar lo mas al dia posible.
Un cordial saludo
Comentario by Legazpi — 15 noviembre, 2010 - 11:51
Gonzalo, debes instalar el runtime de Intel C++ si usas esa versión. Por otro lado, tengo que probar Wildness un poco más porque parece que falla en algunas configuraciones. Cuando tenga un rato subiré una nueva versión aquí.
Muchas gracias por probar.
Comentario by Manuel Llorens García — 5 septiembre, 2010 - 12:43
Buenas Manuel!
Te puse un comentario de respuesta, pero no sé por qué no aparece…
Te lo pongo otra vez, con las últimas modificaciones según lo que he ido probando.
He bajado el dcraw de tu web:
http://www.rawness.es/dcraw/
Primero probé con la compilación Intel C++ para windows 7 de 64 bits que es lo que tengo. Al llamar al dcraw (tras bajar y renombrar el wildness y tras añadir la ruta al Path de windows, pues lo he puesto en c:\dcraw), en vez de aparecerme los parámetros de revelado, como ya te dije, me aparece el siguiente mensaje:
http://farm5.static.flickr.com/4099/4875684949_1a07f413c7_o.jpg
(es una captura de la pantalla)
Si intento usar el programa (por ejemplo usando “dcraw -v -e *.raw”) me da error, y me pone lo siguiente:
“El programa no puede iniciarse porque falta libiomp5md.dll en el equipo. Intente reinstalar el programa para corregir este problema.”
He deducido que el problema es de la propia versión del dcraw y no del wildness, pues si intento usarlo independientemente (simplemente llamando “dcraw” y sin usar tu wildness) me aparece el mismo error.
Luego he probado con la compilación con MSVC. Si uso el programa independientemente llamando “dcraw” sí que me aparecen los parámetros que se pueden usar para el revelado, pero lógicamente no me admite los comodines (*). Al usar tu wildness para solucionar el asunto de los comodines me sigue apareciendo el cartel de antes:
http://farm5.static.flickr.com/4099/4875684949_1a07f413c7_o.jpg
en vez de los parámetros del dcraw cuando llamo “dcraw”. Y luego lo he intentado usar con comodines para extraer los jpg (como intentaba más arriba) y me dice, al lado de cada archivo RAW de la carpeta, “No such file or directory”. Pero sin embargo salen listados todos los archivos…
No sé, chico, ¿se te ocurre qué es lo que estoy haciendo mal?
Muchas gracias por todo!
Comentario by Gonzalo Caballero — 12 agosto, 2010 - 11:42
Buenas Manuel!
Gracias por tu respuesta… ya ves que soy un poco despistado y me había olvidado de responderte…
He copiado en C:\dcraw el ejecutable y el dll compilado con Intel C++ para windows 7 de 64 bits, que es mi sistema operativo, tal como me recomendabas. He descargado el wildness y lo he renombrado poniéndolo en la misma carpeta. He introducido en el Path de windows dcraw (siquiendo las instrucciones que dabas a una de las preguntas que te hicieron en la página de descarga de dcraw).
Si abro una ventana de sistema y tecleo dcraw no me aparecen las opciones de dcraw sino esto:
http://farm5.static.flickr.com/4099/4875684949_1a07f413c7_o.jpg
(es una captura del mensaje).
Por otro lado, si intento ejecutar el dcraw (por ejemplo, estoy tecleando “dcraw -v -e *.raw”) me sale un mensaje de error que dice: “El programa no puede iniciarse porque falta libiomp5md.dll en el equipo. Intente reinstalar el programa para correir este problema”.
¿Qué he hecho mal???
Comentario by Gonzalo — 9 agosto, 2010 - 18:18
Gracias a ti por probarlo. Respecto a tus dudas:
C:\dcrawy pongas ambos allí. Sería cómodo también que añadieras esa ruta al path de Windows (difiere un poco dependiendo de la versión de Windows, de modo que si necesitas ayuda pídela). De ese modo ya lo tienes preparado por si más adelante decides probar el ZeroNoise de Guillermo Luijk, cosa altamente recomendable.Ya me dirás.
Comentario by Manuel Llorens García — 30 junio, 2010 - 16:24
Mil gracias por el aporte. Es muy bueno.
Sólo tengo dos dudas, derivadas de mi poca experiencia informática…
1.- ¿el .dll que viene con dcraw en la compilación intel para 64 bits lo debo copiar en la misma carpeta que el ejecutable dcraw (por ejemplo en C:\Windows)?
2.- Al ejecutar el dcraw tras hacer los pasos que indicas aquí, me sale un texto que supongo que has escrito al hacer el wildness. Pero ahora no me sale la explicación de cada parámetro de dcraw. ¿Qué tengo que hacer para verlo?
Gracias por todo!
Comentario by Gonzalo — 30 junio, 2010 - 10:25
Ya me dirás si te funciona bien.
Un saludo.
Comentario by Manuel Llorens García — 12 junio, 2010 - 20:04
Tiene buena pinta, a ver si saco tiempo para probarlo…
Por cierto, ¿no entra en tus planes una combinación de proceso por lotes con un gui (perfectRAW)?
Comentario by Ramón Portillo — 7 junio, 2010 - 08:53
Thanks very much, Ben. I didn’t know. I will give it a try.
Anyway Wildness works great, so I will keep it.
Comentario by Manuel Llorens García — 7 junio, 2010 - 08:21
Hi, thanks for providing these dcraw binaries.
To add wildcard support to a Visual C++ program, just add “setargv.obj” (for main()) or “wsetargv.obj” (for wmain()) at the link stage. They’re part of the standard Visual C++ distribution (in the lib folder). I suppose that the same files will work in Intel C++, since they try to be perfectly compatible with Microsoft. It’s not a great implementation of wildcards, but it’s trivial to add and it’s better than nothing.
Comentario by Ben — 7 junio, 2010 - 06:06