libopenraw is a desktop agnostic effort to support digital camera RAW files. It include libopenraw and exempi as the main components.

  • libopenraw, a library to parse digital camera RAW files. Also separately the Rust bindings.
  • Exempi, a library to parse XMP metadata. Also separately the Rust bindings.

The road to libopenraw 0.4.0


I just released libopenraw 0.4.0-alpha.2. Actually .0 and .1 got tagged but never released.

Note: the ABI is subject to change.

There is a version on and the tarballs in the usual place. libopenraw-0.4.0-alpha.2.tar.xz This will build the Rust version of libopenraw to be linked dynamically. The crate works like any other crate. If you were using the libopenraw crate before, short of API changes, it should work.

What’s left to be done:

  • A few bit of C API are still missing
  • The colour correction needs completing. This is issue 16.

These are just for the goals of 0.4.0.

I hope to have it out in a couple of month.


Here are the changes since 0.3.7:

New features:

  • The library is now written in Rust. This should provide a safer code. Some API changed, see below.
  • Extract White Balance coefficients.

Camera support:

[ a * denote that static WB coefficients have been included, unless DNG ]

  • Fujifilm Z-S20*.
  • Nikon Z8*.
  • Pannsonic S5M2X*, ZS200D* (Alias of ZS200).
  • Pentax K3 Mark III DNG is properly identified. Added K3 Mark III Monochrome.
  • Sony ILCE-6700*, Z-V1M2*.

Bug fixes:

  • The white and black values for the RAW data are now correctly set.
    • DNG, ERF, PEF: directly from the files.
    • CR2: from the built-in matrices.
    • Values are now quads (for 4 component patterns)
  • The active area from Olympus ORF is extracted from the files.
  • Fujifilm RAF: get black levels and set white levels and non X-trans CFA.
  • DNG: decompress lossless JPEG tiled images (most of DNG converted files).

API changes:

  • or_rawfile_get_rawdata() now returns a newly allocated raw data.
  • or_rawfile_get_thumbnail() now returns a newly allocated thumbnail.
  • or_rawfile_get_thumbnail_sizes() may return nullptr on error.
  • or_rawfile_get_rendered_image() now returns a new allocated bitmap data.
  • or_rawfile_get_metavalue() now take a string key, and the MetaValue must be freed.
  • or_rawfile_get_ifd() return an owned object.
  • or_rawfile_get_calibration_illuminantX() returns a uint32_t instead of an enum.
  • or_metadata_iterator_get_entry() now just return the entry.
  • Added or_metadata_iterator_get_dir() to return the IFD.
  • Added or_metadata_get_key(), or_metadata_get_value() and or_metadata_get_type().
  • Removed or_bitmapdata_new(), or_rawdata_new(), or_thumbnail_new() that are no longer needed.
  • Removed or_ifd_release() that is no longer needed.
  • or_metavalue_get_string() no longer take an index.

Internal changes

  • The mp4parse crate as been moved to src/mp4/parse, and mp4parse_capi has been removed. This allow publishing the crate.

Exempi 2.6.5 is out

Exempi 2.6.5 is out.

Here are the changes:

  • Update XMPCore to Adobe XMP SDK v2023.12
    • Bug fixes
    • C++17 compliance changes
    • Changes to remove deprecated APIs
    • Removing unimplemented APIs in XMPUtils header
  • Fix a potential nullptr dereference.

libopenraw 0.3.7 is out

libopenraw 0.3.7 is out.

Bug fixes:

  • Fix a crash when rendering Leica M Monochron DNG files.
  • Preserve the raw data photometric interpretation when decompressing raw data.


  • Updated Exif tags.

Exempi 2.6.4 is out

Exempi 2.6.4 is out.

Here are the changes:

  • Update XMPCore to Adobe XMP SDK v2023.07
  • Fix some portability build issues with dlopen on BSD: MR 7 (Alyssa Ross)
  • Added missing file type constants from the XMP_SDK.

libopenraw 0.3.6 is out

libopenraw 0.3.6 is out.

Camera support:

[ a * denote that static WB coefficients have been included, unless DNG ]

  • Added Leica M11 Monochrom, Q3.

Bug fixes:

  • Properly decode uncompressed big endian 16 bit raw data from Pentax PEF. Issue #2. Including PENTAX *ist DS. #2
  • Added missing MPL-2.0 license to tarball. #15
  • Fix build issue with Rust 1.70.
  • Fix offline Rust build from tarball.

libopenraw 0.3.5 is out

libopenraw 0.3.5 is out.

New features:

  • The Rust crates are vendored for the tarball. Note: resulting tarball is bigger.

Camera support:

[ a * denote that static WB coefficients have been included, unless DNG ]

  • Added coefficients for Canon R8* and R50*.
  • Added coefficients for Panasonic S5M2*.
  • Added Panasonic GF8*.
  • Added Sony ZV-E1*, ILME-FX30*.

Bug fixes:

  • Fix a missing include with gcc 13. Issue #12.

libopenraw 0.3.4 is out

libopenraw 0.3.4 is out.

Mainly a bug fix related to concurrency.

New features:

Camera support:

[ A * denote that static WB coefficients have been included, unless DNG ]

  • Added Canon R8 and R50.
  • Added Panasonic G95D* and S5M2.

Bug fixes:

  • Ensure that RawFile::init() is never called twice. This would cause crashes if it was called concurrently.

Internal changes:

  • Change mutability of access to the factory and the extensions.

libopenraw 0.3.3 is out

libopenraw 0.3.3 is out.

Added a bunch more cameras, new an old, and even older.

New features:

Camera support:

[ a * denote that static WB coefficients have been included, unless DNG ]

  • Added Canon 200D Mk II*, EOS R6 MKII*, EOS R7* and EOS R10*.
  • Added DJI Mini 3 Pro / FC-3582 (DNG).
  • Added Fujifilm X-H2*, X-H2S*, X-T5*, S6000fd*, SL1000* and HS50EXR*.
  • Added Hasselblad L2D-20c / DJI Mavic 3 Cine (DNG).
  • Added Olympus C5060WZ*, SP570UZ* and E-P7*.
  • Added OM Systems OM-5*.
  • Added Panasonic FZ38*, FZ300*, FZ70, FZ72*, G6*, G70*, G81*, G90*, GM1S*, GX7 Mk3*, GX85*, LF1*, TZ71*, TZ81*, TZ90*, TZ96*, TZ101*, ZS40*/TZ60*/TZ61*.
  • Added Sony 7RM5*.
  • Added Leica D-LUX 6*.
  • Added Nikon Z 30*.

Bug fixes:

  • autoconf-archive is no longer required for development. Issue #11.
  • The tarball will have up to date autoconf files.
  • Test suite bootstrap no longer crashes.
  • Test suite bootstrap no longer leave 0 bytes files.
  • Test suite build without warning if CURL is disabled (no bootstrap).

Exempi 2.6.3 is out

Exempi 2.6.3 is out.

Here are the changes:

  • Issue #29: Update the config.guess and config.sub files in the tarball.
  • Make dist an xz tarball.
  • Issue #30: Fix null to int assignement error. (Francisco Ramos)
  • Issue #28: Fix build error on armhf. (Fabrice Fontaine)

libopenraw Rust bindings

The libopenraw Rust API is now available.

Just add the following to your cargo.toml:

libopenraw = "0.1.1"

Its API is currently limited to thumbnailing. More is to come later.

Note that with the Rust rewrite of libopenraw, this crate will also change drastically.