Initializing... drag & drop files here
Supports: CR2
Render a Canon CR2 RAW photo into a PPM — the plain, uncompressed Portable Pixmap that image-processing and computer-vision code reads directly. This is a pipeline tool, not a photo viewer: PPM stores nothing but raw RGB pixels behind a tiny header, so OpenCV, Pillow, ImageMagick, and the Netpbm utilities can parse it with almost no code. Uniquely for PPM output, you also get a Bit Depth control, so a 14-bit CR2 can be written to a 16-bit PPM instead of the usual 8-bit. If a person is going to look at the photo, CR2 to PNG or CR2 to TIF is the better target — see below for why.
.cr2 file onto the page or click "+ Add Files." You can queue several Canon RAW files and convert them in one batch.| Property | CR2 (source) | PPM (output) |
|---|---|---|
| Full name | Canon Raw version 2 | Portable Pixmap (Netpbm family) |
| Structure | TIFF-based container, lossless-JPEG-encoded sensor data | Tiny ASCII header + flat RGB pixel array |
| Variants | One per Canon body | P6 (binary) or P3 (ASCII text) |
| Bit depth | 14-bit sensor capture | 8-bit (1 byte/sample) or 16-bit (2 bytes/sample) |
| Compression | Lossless | None — fully uncompressed |
| Metadata / color profile | Extensive EXIF, white balance, maker notes | Width, height, and max value only; no alpha, no ICC |
| Best for | Editing the original capture | Feeding raw pixels to scripts and CV tools |
One real reason: a pipeline that reads raw pixels. PPM is, in the words of the Netpbm specification, a "lowest common denominator color image file format" — a short header plus a flat array of RGB bytes — so OpenCV, Pillow, ImageMagick, and the Netpbm tools parse it with almost no code. That is its whole purpose. If a human will view the photo, or you want to attach it somewhere, PPM is the wrong choice: use CR2 to PNG for a lossless, universally viewable image or CR2 to TIF for an editable, metadata-rich file.
Not the RAW latitude — be clear-eyed about this. Converting CR2 to PPM is a render: white balance, exposure, and a tone curve are baked in to produce displayable RGB, exactly as they would be for a JPEG. What 16-bit (High Precision) buys you is two bytes per sample instead of one, so the rendered tones keep far more headroom for further processing without banding. It does not hand your script the unprocessed 14-bit sensor data; for that you would keep working from the CR2 itself in a RAW developer.
Larger than you expect, because PPM is uncompressed. The size is essentially width × height × 3 bytes at 8-bit. A roughly 20-megapixel CR2 (around 5472 × 3648) therefore renders to about 60 MB of raw RGB at 8-bit, and about 120 MB at 16-bit, where each sample takes two bytes per the Netpbm spec. Picture content does not change that — a blank frame and a busy one are the same size. If you need a small file, use a compressed target like PNG or TIF.
Both store the same RGB pixels; they differ only in encoding. P6 is binary — one byte per color sample (or two at 16-bit) — which is compact and the fast path for code. P3 writes the same values as plain ASCII decimal numbers, which is human-readable but several times larger and slower to parse. Most toolchains read and write P6; reach for P3 only when you want to eyeball the raw numbers.
No, and that is by design. A PPM header carries only the image width, height, and maximum sample value; the Netpbm spec notes the format allows "very little information about the image besides basic color," with no alpha channel and no embedded ICC profile or capture metadata. The white balance and exposure are baked into the pixel values during the render, but the EXIF fields themselves do not survive. If you need that metadata to travel with the image, convert to CR2 to TIF instead and carry it there.
Your CR2 file is uploaded over an encrypted connection and processed on our servers — not in your browser. The rendered PPM is yours to download immediately, and files are deleted automatically a few hours after conversion, with no sign-up and no watermark; they are never shared or made public.