LibRaw 0.22 PreRC1 is just published in our Github repository. Here are changes relative to 202502 snapshot:
Camera support
- Canon EOS R1, EOS R5 Mark II
- Fujifilm X-T50, GFX 100S II
- Leica Q3 43, D-Lux8
- Nikon Z6-III (no HE/HE* support)
- Panasonic GH7, S9
- Sony ZV-E10M2, UMC-R10C
Big changes/API changes
- New implementation for Samsung V3 decoder (NX1, NX500, etc)
- Canon AutoRotate mode detection for several cameras.
If LIBRAW_RAWOPTIONS_CANON_CHECK_CAMERA_AUTO_ROTATION_MODE bit is set in imgdata.rawparams: for shots with AutoRotate is Off TIFF::Orientation tag wil be used for imgdata.sizes.flip (and Makernotes rotation tag for other AutoRotate modes).
Note: AutoRotate is detected for limited set of Canon cameras, namely: EOS 6D, 5D Mark IV, 5DS, 5DS R
To extend this list: we need specially shot samples to detect AutoRotate field location in metadata. Contact us for details if you need to add your camera to list and have such camera on hands - New rawoptions/processing flag for DNG processing if compiled
with Adobe DNG SDK:
LIBRAW_RAWOPTIONS_DNG_STAGE23_IFPRESENT_JPGJXL
Similar to LIBRAW_RAWOPTIONS_DNG_STAGE2_IFPRESENT,LIBRAW_RAWOPTIONS_DNG_STAGE3_IFPRESENT flags but applied to JPEG/JPEG-XL compressed images only:
If OpcodeList2/OpcodeList3 tags are present in the input DNG file, these tags will be processed via Adobe DNG SDK, producing corrected (de-bayered) image. - LibRaw::adjust_to_raw_inset_crop exposed via C-API call: libraw_adjust_to_raw_inset_crop(libraw_data_t *lr, unsigned mask, float maxcrop); Note: default maxcrop value for C++ API is 0.55f
- DNG OpcodeList1/2/3: opcode list(s) are read (as is) into imgdata.color.dng_levels.rawopcodes[3]
Minor fixes/improvemtns
- Fixed issue 712: mistype in MIN/MAX that loosens camera WB preset checks
- Updated libraw_types.h to fix calling C++ files in external C -- main includes cannot be in extern C for the library to correctly compile under Swift Modules. This small change lets the compiler finish when compiling the library inside a module.
- Read known parts of the X3F 4.X (Quattro) header
- Rollei loader: more realistic limits
- Additional metadata checks in PhaseOne files processing
- Multiple minor fixes to better handling of specially crafted files
- Fixed regression in Fujufilm S6000/S6500 support
- Support for 4-color lossy-compressed DNG files
- Improved damaged/incorrect/modified CR3 files handling
- Colordata updated for several Fujifilm cameras
- Improved byte order detection for PowerPC
- NOMINMAX defined before #include winsock2.h in LibRaw public header to not provide min/max macros to the code that includes libraw.h

Comments
Wrong color with fujifilm x-t50
Hello i noticed a weird situation with libraw recently i found this raw file which renders with pale and desaturated red color! a different shade of color for other fuji Raf files i have not noticed such thing also tried different params yet always returned the same weird red color the thing is i test the same image with almost many many image processing software from rawtherapee to lightroom even rapid raw and raproc they all rendered the image as the jpeg colors except when used libraw with different setting and params we got the same pale here is the link to the image, i shall say i tested both the master branch and even 0.21.4 !
https://johnricardstock.photoshelter.com/dnld-hires/DSCF5078.RAF?dl_id=A...|e
Here is screenshot of
Here is screenshot of
- On the left: tiff file created by dcraw_emu -T -w file (LibRaw/master from github)
- On the right: JPEG preview from the file (simple_dcraw -e filename)
https://www.dropbox.com/scl/fi/tens8j8oks2ozwchh1otp/Screenshot-2025-11-...
What's wrong with this pair of images?
-- Alex Tutubalin @LibRaw LLC
C++ API calls
This is the color i get!
i am not calling dcraw_emu() directly! i am using c++ api of libraw but the thing for other raf files the colors render correct except this image!
And my libraw::capabilities is as so: LibRaw capabilities bitmask: 0xC0
here is what i get
https://www.dropbox.com/scl/fi/ieqfn6st54d0f2iul7s2k/wrong-color.png?rlk...
cam_xyz and rgb_cam not populated for X-T5 and X-T50 cameras
Hello again Alex , these logs might help with the situation this happens for the RAF files that have this
matrices as so! but i see that in the source there is this line in the colordata.cpp
{ LIBRAW_CAMERAMAKER_Fujifilm, "X-T5", 0, 0, // same CMs: X-T5 and X-T50 { 11809,-5358,-1141,-4248,12164,2343,-514,1097,5848 } },i am on this commit : HEAD is now at 3733457d imported 0.22-PreRC1
also what is the relation between cam_xyz and rgb_cam? can we populate the rgb_cam from cam_xyz? i am asking does the data from colordata.cpp is the cam_xyz?
{ LIBRAW_CAMERAMAKER_Fujifilm, "X-T5", 0, 0, // same CMs: X-T5 and X-T50 { 11809,-5358,-1141,-4248,12164,2343,-514,1097,5848 } },how does libraw knows what color_xyz shall be used ?
i tried to set use_camera_matrix with different values from 0 - 3 always same colors! so i might need some help here cause i got really confused . thanks.
raw-identify -v DSCF5078.RAF
raw-identify -v DSCF5078.RAF (0.22-PreRC1) results in:
Camera2RGB matrix (mode: 1):
1.2560 -0.0421 -0.2139
-0.1496 1.5498 -0.4001
0.0046 -0.3618 1.3572
XYZ->CamRGB matrix:
1.1809 -0.5358 -0.1141
-0.4248 1.2164 0.2343
-0.0514 0.1097 0.5848
The 1st one is rgb_cam, the second one is cam_xyz
BTW, have you checked that red colors you expected are in-gamut for sRGB?
-- Alex Tutubalin @LibRaw LLC
Yes the problem is you see
Yes the problem is you see when i shared my photo
this one: https://www.dropbox.com/scl/fi/ieqfn6st54d0f2iul7s2k/wrong-color.png?rlk...
the red color is pale my question is how am i gonna get the one you shared by calling the libraw c++ api methods because calling dcraw_process() and make_mem_image() even by setting the gamm[0] and gamm[1] does not give me true colors i think in the demosaicing and color rendering i have to do something to get to these colors:
https://www.dropbox.com/scl/fi/tens8j8oks2ozwchh1otp/Screenshot-2025-11-...
if you check these two links they have different shade of red , the thing is this happens for the raf images that have
this parameter as null or empty.
decode(const std::string &path) { LibRaw rawProcessor; int ret = rawProcessor.open_file(path.c_str()); if (ret != LIBRAW_SUCCESS) { throw FileLoadException("Cannot open RAW file: " + path); } // --- Processing parameters --- rawProcessor.imgdata.params.use_auto_wb = 0; rawProcessor.imgdata.params.use_camera_wb = 1; rawProcessor.imgdata.params.use_camera_matrix = 3; rawProcessor.imgdata.params.output_bps = 16; rawProcessor.imgdata.params.exp_correc = 0; rawProcessor.imgdata.params.med_passes = 1; rawProcessor.imgdata.params.fbdd_noiserd = 1; rawProcessor.imgdata.params.four_color_rgb = 1; rawProcessor.imgdata.params.user_qual = 4; rawProcessor.imgdata.params.use_fuji_rotate = 1; rawProcessor.imgdata.params.dcb_iterations = 1; rawProcessor.imgdata.params.dcb_enhance_fl = 1; rawProcessor.imgdata.params.no_interpolation = 0; rawProcessor.imgdata.params.output_color = 1; rawProcessor.imgdata.params.no_auto_bright = 1; ret = rawProcessor.unpack(); if (ret != LIBRAW_SUCCESS) { throw Exception("Failed to unpack RAW file: " + path); } // --- Process the RAW data --- ret = rawProcessor.dcraw_process(); if (ret != LIBRAW_SUCCESS) { throw EXCEPTION(); } libraw_processed_image_t *procImage = rawProcessor.dcraw_make_mem_image(&ret); if (!procImage || !procImage->data) { if (procImage) LibRaw::dcraw_clear_mem(procImage); rawProcessor.recycle(); throw Exception("Failed to get processed image memory"); } //return processed image data }the above code is how i get the attached look and color i think somehow in the demosaicing part the colors do not render as they should! and that's when the "rawProcessor.imgdata.color.cam_xyz" is empty or all zeros what i understood is even if i populate that base on the colordata.c info nothing changes for the end result. what am i missing to get to the look and color you shared in the link? thanks.
Please make sure that the
Please make sure that the header files you use when building your application match the version of the library you are using.
Also: rawProcessor.imgdata.color.cam_xyz can never be null because this is pre-allocated array in imgdata.color
-- Alex Tutubalin @LibRaw LLC