Configuring ImageMagick RAW Delegates with DCRAW and UFRAW-Batch
November 6th, 2015 | Back to Blog Listing

It's not very often that I take the time to make technical posts for all of the complexities that go into my personal website, but this one was so frustrating and time-consuming that I figured I would share my findings with the world. I've also been having to do a lot of ImageMagick work in my professional life lately and so I fully understand the frustration of not having good documentation on some of this.

The problem:

I have a bunch of .CR2 files in my photo gallery (RAW image files shot on a Cannon). I am using ImageMagick for a bunch of different processing components including resizing the images for my gallery. Unfortunately ImageMagick was failing due to UFRAW-batch not being found. The error would look something like this:

convert: delegate failed `"ufraw-batch" --silent --wb=camera --black-point=auto --exposure=auto --create-id=also --out-type=png --out-depth=16 "--output=%u.png" "%i"' @ error/delegate.c/InvokeDelegate/1061.

After doing a ton of research and trying to hunt down ways to make ufraw-batch work with ImageMagick, I finally went down a different path of deciding to configure DCRAW as my RAW-file ImageMagick delegate. This method wound up working perfectly, but it does require some special configuring. I've detailed that process below.

Assumptions:

The following installation was done on an Amazon AMI instance (essentially a CentOS machine), with ImageMagick 6.7.8-9 2015-10-08 Q16 installed. It also assumes the user has ROOT access and that all of the steps are performed as ROOT.

Installing DCRAW:

  • If you haven't already, sudo to root:
    su root
  • Create a directory to work with somewhere in your home:
    mkdir ~/dcraw
    cd ~/dcraw/
  • Download DCRAW
    wget http://mirror.centos.org/centos/6/os/x86_64/Packages/dcraw-8.96-1.1.el6.x86_64.rpm
  • Install the RPM package
    rpm -Uvh dcraw-8.96-1.1.el6.x86_64.rpm


Installing DCRAW Dependencies (if necessary):

At this point you may find that you need to install the liblcms dependency. If this has happened then the installation of your RPM package will have failed. If DCRAW installed without any problems then skip to the libJpeg section below. If there was a dependency problem, take a look at the following:

  • Download liblcms:
    wget ftp://ftp.pbone.net/mirror/archive.fedoraproject.org/fedora/linux/releases/17/Fedora/x86_64/os/Packages/l/lcms-libs-1.19-5.fc17.x86_64.rpm
  • Install liblcms
    rpm -Uvh lcms-libs-1.19-5.fc17.x86_64.rpm
  • Attempt to install DCRAW again
    rpm -Uvh dcraw-8.96-1.1.el6.x86_64.rpm

Please note that there could certainly be other dependencies missing as well. This was simply a problem that I ran into with a pretty typical modern Linux installation.


Installing libJpeg (for cjpeg):

At this point DCRAW should be installed on your system. The best you'll really be able to do is to convert to either a TIFF file or get a raw stream of JPG. The problem with the RAW stream (assuming you're wanting to export to a jpeg as most people will want to do) is that it doesn't help you to actually compress the JPG stream into a usable file. If you try to simply pipe the STDOUT to a file (xxx.jpg for example), the image won't load as it won't be properly compressed for jpeg specs. You'll need to use cjpeg (or a similar tool) to accomplish this final piece.

  • Download cjpeg
    wget http://downloads.sourceforge.net/libjpeg-turbo/libjpeg-turbo-1.4.2.tar.gz
  • Unzip the gzip file and extract the tarball:
    gunzip libjpeg-turbo-1.4.2.tar.gz
    tar -xvf libjpeg-turbo-1.4.2.tar
  • Go into the newly extracted directory and install libjpeg:
    cd libjpeg-turbo-1.4.2
    ./configure
    make
    make install


Testing cjpeg:

At this point you should have DCRAW, any necessary dependencies, and cjpeg installed on your system. Incidentally, cjpeg will likely have been installed to /opt/libjpeg-turbo/bin/cjpeg. If you can't find it, do the following:

  • Update the mlocate database and find the jpeg tool:
    updatedb
    locate cjpeg

From here you'll have the fully qualified path of where the cjpeg executable lives. Mine was installed to /opt/libjpeg-turbo/bin/cjpeg (which I assume is a standard location for this program).


Configuring ImageMagick Delegates:

So the final part of this process is to configure the RAW delegate for ImageMagick so that instead of trying to use ufraw-batch it instead uses your newly installed dcraw. Be sure to backup your delegates.xml file before making any changes to the file! You can break your installation of ImageMagick if you're not careful!

  • Find your ImageMagick delegates file
    locate delegates.xml
  • Be sure to backup the delegates file first!
    cp /etc/ImageMagick/delegates.xml ~/
  • Open the file with your favorite editor:
    vim /etc/ImageMagick/delegates.xml
  • Search the document for ufraw-batch


Replace the ImageMagick Delegates:

That untouched line in the delegates.xml file should look something like this:

<delegate decode="dng:decode" command=""ufraw-batch" --silent --create-id=also --out-type=png --out-depth=16 "--output=%u.png" "%i""/>

You'll want to change it to look like this (using your path to cjpeg):

<delegate decode="dng:decode" command=""dcraw" -c -q 3 -H 5 -w "%i" | "/opt/libjpeg-turbo/bin/cjpeg" -quality 100 > "%o""/>