Back to Dave Coffin's Home Page
Raw Digital Photo Decoding in Linux
Not affiliated with
Canon,
Nikon,
Kodak,
or any other company named herein.
Welcome! If you are wondering how to connect your digital
camera and download images to a Linux PC, go to the
gPhoto homepage.
My software is for processing those images after
downloading them.
If you're downloading JPEG files, you don't need my software
at all. The image has already been processed inside the
camera. All digital cameras made since 1997 produce JPEG
images, so why would you want to do it any other way?
Well, despite the convenience and ubiquity of JPEG, there are
some disadvantages. JPEG is a lossy format -- to fit a big
image into a small file, a lot of information is thrown away.
That's why midrange and high-end digital cameras offer an
alternative: Raw, unprocessed CCD data files, for which the
camera manufacturer provides special decoding software.
Of course this software is for Windows and Macintosh only,
and there's no source code. So it's useless to users of other
operating systems, programmers hoping to design a better
interpolation algorithm, and historians not yet born in an
era when the only Windows machines will be in museums.
So here is my mission: Write an ANSI C program that decodes
any raw image from any digital camera on any computer running
any operating system.
That program is called dcraw.c,
and it's become a standard tool within and without the
Open Source world. It's small (about 4000 lines), portable
(standard C libraries only), free (both "gratis" and "libre"),
and when used skillfully, produces
better
quality
output
than the tools provided by the camera vendor.
Here's my resume.
I do freelance consulting related to dcraw, and I'm also
available for full-time work in BIOS engineering or UNIX
system administration.
I can be reached by sending e-mail to cybercom dot net with
the username "dcoffin".
My Code
There are no restrictions on this code, although I would like
to receive credit for it. Donations are welcome, especially
if you're using my code commercially.
-
dcraw.c -- Convert raw photos to PPM
Supports 142 cameras at last count.
Compile with "gcc -o dcraw -O3 dcraw.c -lm -ljpeg".
Run with no arguments to see a usage message.
Don't complain that 16-bit output is too dark -- read the FAQ!
-
rawphoto.c -- basic plugin for GIMP 1.2 & 2.0
After installing "dcraw",
do "gimptool --install rawphoto.c".
My plugin provides a simple dialog box for loading raw
files into the Gimp.
Pawel Jochym
,
Udi Fuchs
, and
Joseph Heled
have written much nicer plugins, with live preview, histograms,
and color curves.
-
.badpixels -- my camera's "hot pixels"
This file tells dcraw which pixels have died and when,
so that it can interpolate around them.
-
dcraw.1 -- UNIX manpage for dcraw
Contains details and helpful hints not found elsewhere.
-
dcwrap -- example wrapper script
This is what I use with my PowerShot G2.
-
dcraw.c,v -- complete unabridged RCS file
In case you want to learn more about the history of dcraw.c.
If you don't have the RCS toolkit,
download it here.
-
parse.c -- read image data structures
This program displays CIFF and TIFF data structures in a very
cryptic format. It also extracts the thumbnail, if the image has
one. Compile with "gcc parse.c".
-
fixdates.c -- set time on CRW files
Sets the time on CRW files to show when the photo was taken,
assuming that the camera's clock was set to Universal Time.
For hackers only:
- decompress.c
is a simple reference decompressor for CRW files.
- pgm.c
converts the decompressed data into an 8-bit grayscale image.
- sony_clear.c
decrypts SRF files from the Sony DSC-F828.
Other dcraw-based solutions
The following image viewers use dcraw or pieces of dcraw.c
to decode raw digital camera images:
Frequently Asked Questions
- I don't have a C compiler. Could you send me an executable?
- No, but Francisco Montilla provides up-to-date Mac OS and
Windows executables
on his website.
And Benjamin Lebsanft has volunteered to maintain
Windows executables optimized for specific CPUs.
If you're familiar with the DOS command line but don't know C,
you can install this
free C compiler for Windows and compile dcraw.c quite easily.
- How can I read the EXIF data (shutter speed, aperture, etc.)?
- For JPEG files, Matthias Wandel wrote
an excellent utility called "jhead".
For Canon CRW files, try
this tool by Sven Riedel. Also
Peter Galbavy's website and mailing list
have a lot of information about CRW format.
- Do you have any specifications describing raw photo formats?
- No. If such documents exist, the camera companies keep
them under lock and key. Dcraw.c is the best documentation
you can get without resorting to espionage.
- Why is 16-bit output dark, flattened, or unreadable?
- If you want pretty pictures straight out of dcraw, stay with
24-bpp output. 16-bit linear output is the best raw material
for professional image editors such as
PhotoShop and
CinePaint,
but it's no good for most image viewers.
- Could you please add an option for TIFF / PNG / BMP / JPEG output?
- No. Dcraw writes PPM only. To convert to other formats:
dcraw -c crw_0001.crw | pnmtotiff -truecolor > crw_0001.tiff
dcraw -c crw_0001.crw | pnmtopng > crw_0001.png
dcraw -c crw_0001.crw | ppmtobmp > crw_0001.bmp
dcraw -c crw_0001.crw | cjpeg > crw_0001.jpeg
I used the
Netpbm toolkit
in these examples.
ImageMagick
also does command-line format conversions. Both are free.
- What does the "-f" option do? What's "four-color RGB"?
- If you see patterns like this
in your output images, use the "-f" option. Otherwise, don't.
- Why are there false colors along edges within the image?
- Because of interpolation. This is a hard problem, easily defined:
- Take a three-color RGB image. At each pixel, set two color
values to zero.
- Reconstruct the original three-color image as best you can
from the remaining one color per pixel.
This research paper by Ting Chen
compares various color-interpolation algorithms. Dcraw uses his
favorite, the Variable Number of Gradients Method, with Bilinear
as an option for quick test images.
Other methods are described in
the research of Rajeev Ramanath
and at
http://dsplab.ece.cornell.edu/.
The Foveon X3 Capture chip requires a different kind of interpolation.
Unlike CCD arrays, it captures three colors at every pixel location.
But the colors are not well separated, so the raw data looks very gray.
Enhancing the color without also enhancing noise is very difficult.
- How do I get my camera to take raw photos?
-
For some Nikon Coolpix cameras, you need to enable a
special "DIAG RAW" mode.
For Casio cameras, see
Maurice Delaney's website
or read
this discussion on dpreview.
For the Minolta DiMAGE G400 and G500,
go here.
For the Minolta DiMAGE Z2 and Nikon Coolpix 2100/3100/3700,
go here.
For other cameras, refer to the User's Manual.
- Does dcraw work with my camera?
- Most likely, yes. The cameras listed below are supported.
If your camera is not on the list, try dcraw anyway. If it
doesn't work, post a raw image to a website and e-mail me the
URL. If you don't have a website, use
dropload.com.
Ideally, your sample image should show a standard white card
or color chart in direct sunlight, with other colors in the
background.
- Canon PowerShot 600
- Canon PowerShot A5
- Canon PowerShot A5 Zoom
- Canon PowerShot A50
- Canon PowerShot Pro70
- Canon PowerShot Pro90 IS
- Canon PowerShot G1
- Canon PowerShot G2
- Canon PowerShot G3
- Canon PowerShot G5
- Canon PowerShot G6
- Canon PowerShot S30
- Canon PowerShot S40
- Canon PowerShot S45
- Canon PowerShot S50
- Canon PowerShot S60
- Canon PowerShot S70
- Canon PowerShot Pro1
- Canon EOS D30
- Canon EOS D60
- Canon EOS 10D
- Canon EOS 20D
- Canon EOS 300D
- Canon EOS DIGITAL REBEL
- Canon EOS Kiss Digital
- Canon EOS D2000C
- Canon EOS-1D
- Canon EOS-1DS
- Canon EOS-1D Mark II
- Canon EOS-1Ds Mark II
- Casio QV-2000UX
- Casio QV-3000EX
- Casio QV-3500EX
- Casio QV-4000
- Casio QV-5700
- Casio Exlim Pro 600
- Casio Exlim Pro 700
- Contax N DIGITAL
- Creative PC-CAM 600
- Epson R-D1
- Fuji FinePix E550
- Fuji FinePix F700
- Fuji FinePix F810
- Fuji FinePix S2Pro
- Fuji FinePix S3Pro
- Fuji FinePix S20Pro
- Fuji FinePix S5000
- Fuji FinePix S5100/S5500
- Fuji FinePix S7000
- Imacon Ixpress
- Kodak DC20 (see Oliver Hartman's page)
- Kodak DC25 (see Jun-ichiro Itoh's page)
- Kodak DC40 (aka "Logitech Fotoman Pixtura")
- Kodak DC50
- Kodak DC120 (also try kdc2tiff)
- Kodak DCS315C
- Kodak DCS330C
- Kodak DCS420
- Kodak DCS460
- Kodak DCS460A
- Kodak DCS520C
- Kodak DCS560C
- Kodak DCS620C
- Kodak DCS620X
- Kodak DCS660C
- Kodak DCS660M
- Kodak DCS720X
- Kodak DCS760C
- Kodak DCS760M
- Kodak EOSDCS1
- Kodak EOSDCS3B
- Kodak NC2000F
- Kodak ProBack
- Kodak PB645C
- Kodak PB645H
- Kodak PB645M
- Kodak DCS Pro 14n
- Kodak DCS Pro 14nx
- Kodak DCS Pro SLR/c
- Kodak DCS Pro SLR/n
- Konica KD-400Z
- Konica KD-510Z
- Leaf Valeo 11
- Leaf Valeo 22
- Leaf Volare
- Leica Digilux 2
- Minolta DiMAGE 5
- Minolta DiMAGE 7
- Minolta DiMAGE 7i
- Minolta DiMAGE 7Hi
- Minolta DiMAGE A1
- Minolta DiMAGE A2
- Minolta DiMAGE A200
- Minolta DiMAGE G400
- Minolta DiMAGE G500
- Minolta DiMAGE G600
- Minolta DiMAGE Z2
- Minolta DYNAX/MAXXUM 7D
- Nikon D1
- Nikon D1H
- Nikon D1X
- Nikon D100
- Nikon D2H
- Nikon D70
- Nikon E950 ("DIAG RAW" hack)
- Nikon E990 ("DIAG RAW" hack)
- Nikon E995 ("DIAG RAW" hack)
- Nikon E2100 ("DIAG RAW" hack)
- Nikon E2500 ("DIAG RAW" hack)
- Nikon E3700 ("DIAG RAW" hack)
- Nikon E4300 ("DIAG RAW" hack)
- Nikon E4500 ("DIAG RAW" hack)
- Nikon E5000
- Nikon E5400
- Nikon E5700
- Nikon E8400
- Nikon E8700
- Nikon E8800
- Olympus C5050Z
- Olympus C5060WZ
- Olympus C70Z,C7000Z
- Olympus C8080WZ
- Olympus E-1
- Olympus E-10
- Olympus E-20
- Olympus E-300
- Panasonic DMC-LC1
- Pentax *ist D
- Pentax *ist DS
- Pentax Optio S
- Pentax Optio S4
- Pentax Optio 33WR
- Phase One LightPhase
- Phase One H10
- Phase One H20
- Phase One H25
- Rollei d530flex
- Sigma SD9
- Sigma SD10
- Sinar 12582980-byte
- Sony DSC-F828
- Sony DSC-V3
History
It started in February 1997, when I bought a Canon PowerShot 600.
Decoding the raw data was more difficult than I had expected,
knowing nothing about filter arrays, colorspace conversion, etc.
But in August 1997, I found a decent interpolation technique,
and finally was able to create images comparable in quality to
Canon's.
Word slowly spread, and people asked me to do other cameras,
sending me sample images to decode. I added support for the
PowerShot A5 in May 1999 and the PowerShot A50 and Pro70 in
May 2000.
In late September 2001, after months of effort, I finally
figured out the lossless compression algorithm used by the
PowerShots Pro90, G1, G2, S30, S40, and EOS D30/D60 cameras.
I solved the Canon EOS-1D on Jan 28, 2002 and the Nikon
compressed NEF format on March 24, 2002. Olympus ORF format
is not compressed, so it's much easier to decode.
On November 19, 2002, I was laid off. During that month, I
added nineteen Kodak cameras, the PowerShot G3/S45, the Canon
EOS-1DS, the Fuji S2, and the Minolta DiMAGE 7. In early
December, I replaced the whole color-interpolation system,
yielding sharper images for all cameras.
On December 10, I attacked the Sigma SD9. I solved the
compression algorithm on December 31, then spent another
six weeks constructing a Foveon-specific interpolation
routine to enhance color and reduce noise.
Misc. Stuff
A detailed description
of the PowerShot 600 written in 1997.
renum
A bash script to rename all files in the current directory,
numbered by date of last modification. For example,
renum rover 56
will rename the files to "rover-0056.jpg", "rover-0057.jpg",
"rover-0058.jpg"...
lcfile
A Python script to rename files and directories to lowercase.
Patches for XV 3.10a
XV is still my favorite image viewer, even though its last
official release was in 1994. In case you're still using
this antique, here are some useful patches for it:
To install them, unpack the
xv-3.10a
distribution. From the parent (not the xv-3.10a subdirectory) do:
cat patch1 patch2 | patch -p0
-
Smooth patch
Using XV to expand an image from 832x608 to 832x624 blurs it badly.
This patch does the interpolation correctly, and twice as fast.
This bug report explains the fix
-
PostScript free() patch
Prevents a segmentation fault when saving a color-adjusted image
in PostScript format.
-
JPEGlib patch
Changes a couple of JPEG library defaults.
-
My XV super-patch
Adds PNG support, raw photo decoding, non-destructive deletion,
simulated color-blindness, plus all of the above patches.