The joy of photo printers (and free software)
For some time now, I've wanted to pick up a compact photo
printer
to take with me on assignment, with the blessings of those I
am taking photographs for. A little under two weeks ago, I
finally
did, purchasing a Canon
SELPHY ES1.
It's a sweet little printer, using the old technique of
dye-sublimation to create true continuious tone prints,
rather than
glorified halftoning that even the best inkjet printers use.
Not only
do the prints come out looking indistinguishable from what a
photo lab
would produce -- they're water- and smudge-proof.
I did my homework; apparently the majority of Canon's
dyesub printers
were supprted under Linux via the gutenprint
drivers, but
not the ES1 specifically. No big deal, it should just work.
Even in
the absence of direct Linux printing, I could print from the
camera
directly or shove a memory card into the printer. All in
all, things
should Just Work.
They didn't.
My first test involved taking a few converted-from-RAW
JPEG images
out of my archives, copying them to a CF card, and trying to
print that.
I got a rather crass Incompatible JPEG Format error
message out
of the printer. Interestingly my camera also errored out on
those
images, complaining that The image could not be
displayed..
After some heavy digging it turns out the printer makes
heavy use of the
EXIF data, and if it's not present (or in many cases, simply
modified!)
the printer gives up. WTF? Why can't Canon document what
it needs
in a JPEG rather than just displaying a useless error
message?
As I shoot RAW images, not being able to convert, crop,
tweak, then
print a random image via a CF card seriously sucked. So,
I'll try Plan
B: Print the images from the camera via the universal
PictBridge
interface.
No good.
Apparently my Nikon D200 camera can't print RAW images.
WTF? Even
if the camera could only print JPEGs, the NEFs have a
full-res embedded
JPEG image in the file that would print just fine. Sigh.
Onto Plan C:
Print directly from my laptop.
No good.
Apparently the SELPHY ES1 is incompatible with Canon's
older dyesubs.
To some extent I expected this, as it uses a different
ribbon/dye pack,
but that's mostly because the printer's physical engine is
oriented
differently -- and it's also why I bought this model over
the others.
Thanks to this incompatibility, I can't print from Linux
either. Onto
Plan D: Print from Windows. Surely that will work, right?
Sort of.
The printer worked just fine from Windows... but the
prints were all
quite dark. Too dark. After some digging, I found the
driver's options
panel and knocked the brightness up a few notches.. and
while not
perfect (yellow-ish color balance, mostly) the images were
finally
acceptable. But this would mean I'd need to boot into
Windows to print,
which really sucks as the rest of my RAW workflow is
Linux-based.
Fortunately, the printer is USB-based, which means that
thanks to a
wonderful tool called Snoopy2, it's trivial to get a full
dump of the
entire communications chain between the printer and its
driver. Armed
with this dump, I could figure out the protocol and hack
support into
gutenprint.
After an initial learning curve, I succeeded. I was able
to generate
a binary dump indistinguishable from what Windows generated
(except, of
course, for the image data). So, cackling with glee, I
proceeded to
dump this out to the printer.
No good.
The device write() apparently blocked on the very first
chunk of
data. After much experimentation, I discovered that the
logical chunks
of data needed to be broken apart and written separately. The
initialization sequence and the Yellow, Magenta, and Cyan
image data all
needed to have pauses between them (the printer sends a
status message
when it's ready) or the printer's USB interface locks up
altogether.
Sigh. So I split apart my dump file into its logical
chunks, and
dump them separately to the printer.
Success!
Not only did it print, but the brightness and color
balance looked
great. Yes, the images look much better than what their
Windows
driver manages to put out.
Ah, I love Free Software. When it doesn't JustWork(tm),
you can fix
it so it does.
All that remains is getting my patch
integrated into upstream gutenprint, and figuring out a
way to
intellently spool the printer data in a CUPS-compatible
manner.
Oh, this was the first image I printed:
I took it last weekend at Paradise
Beach. I have no idea who this guy is, but he was out
kite-surfing
on a windy but otherwise beautiful day.
Oh, as a footnote -- about a month before I ordered my
ES1, Canon
announced its successor models, the ES2 and ES20. Same
basic specs, but
when untethered the printers had fancier (and faster)
feature sets. I
needed a printer for next weekend (November 16-18) and
nobody had a
useful ETA on when they'd show up, so I bought the ES1 at a
discount.
On the 9th, four days after I received my ES1, everyone
suddently got
them in stock. Sigh.
Syndicated 2007-11-11 14:38:31 from Solomon Peachy