Skip to main content

flashraw

Fast, safe camera RAW decoding for Python, with zero-copy NumPy output.

flashraw reads RAW files from most cameras (1,980 of the 2,016 files of the raw.pixls.us corpus; the rest are formats not supported yet, see docs/formats.md) — DNG, CR2, CR3, CRW, NEF/NRW, ARW/SR2/SRF, RAF, RW2, ORF, PEF, SRW, IIQ, 3FR/FFF, X3F, MRW, KDC/DCR, ERF, MEF and more — and returns sensor-domain data (or display-ready RGB) as NumPy arrays, together with everything needed to interpret them: CFA layout, black/white levels, white balance, colour matrices, crops, orientation, lens and exposure metadata, and embedded previews.

  • Fast: the decoder is written in Rust with SIMD kernels and multithreaded decoding (including single-stream formats such as CR2, lossless DNG and NEF).
  • Zero-copy: decoded pixels become the NumPy array's memory; bytes inputs and paths (memory-mapped) are not copied either.
  • Parallel: decoding releases the GIL — decode many files from Python threads.
  • Safe: bounds-checked parsing, safety limits for untrusted input, fuzzed; malformed input raises a FlashRawError, never crashes the interpreter. Truncated files are recovered with structured warnings (or rejected with corruption_policy="strict").
  • Typed: frozen dataclasses for metadata, py.typed, mypy --strict clean.

One abi3 wheel per platform supports CPython 3.9 and later (Linux x86-64/ARM64, macOS x86-64/ARM64, Windows x64; tested by the maintainers on Linux x86-64 and macOS arm64). The only dependency is NumPy.

Install

pip install flashraw
pip install "flashraw[pil]"   # optional: Frame.to_pil()

Usage

import flashraw

with flashraw.open("photo.NEF") as raw:          # path, bytes, bytearray, memoryview or file object
    m = raw.metadata
    print(m.camera.name, m.lens.model, m.exposure.iso, m.exposure.exposure_time)
    print(m.cfa.pattern, m.black_level.mean, m.white_level, m.white_balance)

    frame = raw.decode()                          # sensor data
    frame.array                                   # numpy uint16, shape (height, width)
    frame.active_view()                           # view of the active area

    rgba = raw.decode("rgba8").array              # display-ready sRGB, uint8 (h, w, 4)
    raw.decode("rgba8").to_pil().save("photo.png")

    jpeg = raw.preview_bytes()                    # embedded JPEG preview, no decoding

# One-liner:
image = flashraw.imread("photo.CR3")              # RGBA8 array

Outputs (output=, the first argument of decode / imread):

output dtype, shape content
raw-u16 uint16 (h, w) or (h, w, c) sensor samples as stored (default)
raw-f32 float32 (h, w) or (h, w, c) the same as floats (floating-point DNGs unscaled)
normalized float32 (h, w) or (h, w, c) black-subtracted, white-normalised to [0, 1], CFA layout kept
linear-rgb float32 (h, w, 3) demosaiced, white-balanced, linear sRGB primaries (or color_space)
linear-rgb-f16 float16 (h, w, 3) the same as half floats
linear-rgb16 uint16 (h, w, 3) the same, clipped to [0, 1] and scaled to [0, 65535]
rgba8 uint8 (h, w, 4) display-ready sRGB, orientation applied
rgb16 uint16 (h, w, 3) display-ready sRGB at 16 bits, orientation applied

Options of decode: backend ("auto", "cpu", "simd", "gpu"), threads, region, crop (True, or "active" for raw outputs), demosaic ("bilinear", "half-size"), apply_opcodes, corruption_policy ("recover", "strict"), exposure, black_point, white_point, preview_fallback (RGB outputs of undecodable sensor data return the embedded full-size preview, frame.source == "preview"), color_space ("srgb", "display-p3", "adobe-rgb", "prophoto", "rec2020"; frame.icc_profile is the matching ICC profile), output_profile (convert to any RGB ICC profile; with intent and black_point_compensation). flashraw.open takes max_samples and max_dimension to tighten the limits for untrusted files. Names that differ from the other bindings: docs/api-names.md.

from concurrent.futures import ThreadPoolExecutor

def decode(path):
    return flashraw.imread(path, "raw-u16", threads=1)

with ThreadPoolExecutor(8) as pool:               # runs in parallel: the GIL is released
    arrays = list(pool.map(decode, paths))

Errors derive from flashraw.FlashRawError (UnsupportedFormatError, CorruptFileError with structured truncation details, InvalidArgumentError, ...).

Documentation: docs/python.md. FlashRaw is also available as a Rust crate, a command-line tool and an npm package (repository).

License

MIT OR Apache-2.0.

Metadata

Release files for flashraw 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for flashraw 0.1.0
File Size Uploaded Provenance Actions
flashraw-0.1.0.tar.gz 822.7 kB Without provenance Details for flashraw-0.1.0.tar.gz

Built distributions (wheels)

Table of built distributions (wheels) for flashraw 0.1.0
File Actions
flashraw-0.1.0-cp39-abi3-win_amd64.whl CPython 3.9 abi3 Windows x86-64 Details for flashraw-0.1.0-cp39-abi3-win_amd64.whl
flashraw-0.1.0-cp39-abi3-manylinux_2_28_x86_64.whl CPython 3.9 abi3 Linux glibc 2.28+ x86-64 Details for flashraw-0.1.0-cp39-abi3-manylinux_2_28_x86_64.whl
flashraw-0.1.0-cp39-abi3-manylinux_2_28_aarch64.whl CPython 3.9 abi3 Linux glibc 2.28+ ARM64 Details for flashraw-0.1.0-cp39-abi3-manylinux_2_28_aarch64.whl
flashraw-0.1.0-cp39-abi3-macosx_11_0_arm64.whl CPython 3.9 abi3 macOS 11.0+ ARM64 Details for flashraw-0.1.0-cp39-abi3-macosx_11_0_arm64.whl
flashraw-0.1.0-cp39-abi3-macosx_10_12_x86_64.whl CPython 3.9 abi3 macOS 10.12+ x86-64 Details for flashraw-0.1.0-cp39-abi3-macosx_10_12_x86_64.whl

Total release size: 31.4 MB

Release files / flashraw-0.1.0.tar.gz

Download URL flashraw-0.1.0.tar.gz
Size 822.7 kB
Tags Source
SHA-256 checksum
How to use checksums
1c654feb1bf9fed55df29b7d21a8ce213e89b35a3cb1f7d89c0b1dce111907d2
BLAKE2b-256 checksum
How to use checksums
612c3afa7788c87ccb6dfa1959eb3ed266f259b5a5b5f047d7cac2f0d9b9a005
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.5

Release files / flashraw-0.1.0-cp39-abi3-win_amd64.whl

Download URL flashraw-0.1.0-cp39-abi3-win_amd64.whl
Size 3.3 MB
Tags CPython 3.9 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
b5b96e78cb5c6d42e7d0d13e6225070ee293662af06671de930d5134b3a5cb87
BLAKE2b-256 checksum
How to use checksums
d551b13d5c374b3f651ec4e26defeb04d4c12bb58816bed02f4f1e51a60f9e5e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.5

Release files / flashraw-0.1.0-cp39-abi3-manylinux_2_28_x86_64.whl

Download URL flashraw-0.1.0-cp39-abi3-manylinux_2_28_x86_64.whl
Size 10.6 MB
Tags CPython 3.9 Linux glibc 2.28+ x86-64 abi3
SHA-256 checksum
How to use checksums
aa41e37bbf1135f6fdf232b33de26cdbd9415a9e1efd099fd77a18ef393c63d0
BLAKE2b-256 checksum
How to use checksums
c6d1ae0392ca40f99ee5a6360c9c0c67c45d630262a2993791de38610a9d2655
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.5

Release files / flashraw-0.1.0-cp39-abi3-manylinux_2_28_aarch64.whl

Download URL flashraw-0.1.0-cp39-abi3-manylinux_2_28_aarch64.whl
Size 9.9 MB
Tags CPython 3.9 Linux glibc 2.28+ ARM64 abi3
SHA-256 checksum
How to use checksums
9e465d3c4389f3554b2df29a019de4fed673d7b1206fb8a33866d7d760ca87e2
BLAKE2b-256 checksum
How to use checksums
66fef3163198647b7e18a56636632f8e88cd3b1a167068a350fc9a49d118ab8f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.5

Release files / flashraw-0.1.0-cp39-abi3-macosx_11_0_arm64.whl

Download URL flashraw-0.1.0-cp39-abi3-macosx_11_0_arm64.whl
Size 3.3 MB
Tags CPython 3.9 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
7d48fc1199542ebe804298b366dda4952761d0fef965395046fd784df9355fa7
BLAKE2b-256 checksum
How to use checksums
9f4630f65524187c7e6b578182e810446677a5d495ce40b12f7b98e1f7d72ab3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.5

Release files / flashraw-0.1.0-cp39-abi3-macosx_10_12_x86_64.whl

Download URL flashraw-0.1.0-cp39-abi3-macosx_10_12_x86_64.whl
Size 3.4 MB
Tags CPython 3.9 abi3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
4520412e51f1617b9d6b762d02251d670d3de7c5952e205e9bc4e27a7a5272e1
BLAKE2b-256 checksum
How to use checksums
f77bc28a0ad18c0a34752f8d961b25eefa351485eabe4edc871be95ba5806fe7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.5

Security for flashraw 0.1.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.1.0 This release

6 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page