English inicio | presentación | artículos | descargas | enlaces

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();
            }
        }
    }
}
VN:F [1.9.13_1145]
Rating: 0.0/5 (0 votes cast)
  1. [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:

  1. Descarga de binarios de dcraw para Windows
  2. Dcraw con caché y soporte para Rawzor
  3. Descarga de binarios de dcraw para Linux
  4. dcraw.dll casi a punto

11 comentarios. Deja un comentario »

RSS feed para los comentarios de esta entrada. TrackBack URL

Deja un comentario