Fuji X-Trans files washed out colors in 2021
I am using the release verson 0.20.2 in my lib (librawfx.org). Now I wanted to update to the newest snapshot version 202110. The problem I have now is that all x-trans files have now washed out colors.
Must I call something special for fuji x-trans files to get the right colors ?
With 0.20.2 all is working as expected but with the latest snapshot version not. You can find the example file under https://github.com/lanthale/LibRawFX/blob/main/LibRawFX/src/main/ressour...
Code I am using (sorry for the Java language but basically I am using the C API):
MemoryAddress iprc = org.libraw.linuxosx.libraw_h.libraw_init(0); Logger.getLogger(LibrawImage.class.getName()).log(Level.FINEST, null, "Memory dddress native lib was: " + iprc.toRawLongValue()); MemorySegment datasegment = org.libraw.linuxosx.libraw_data_t.ofAddress(iprc, scope); MemorySegment params$slice = org.libraw.linuxosx.libraw_data_t.params$slice(datasegment); org.libraw.linuxosx.libraw_output_params_t.use_camera_wb$set(params$slice, 0); org.libraw.linuxosx.libraw_output_params_t.use_auto_wb$set(params$slice, 0); org.libraw.linuxosx.libraw_output_params_t.output_tiff$set(params$slice, 0); org.libraw.linuxosx.libraw_output_params_t.half_size$set(params$slice, 0); org.libraw.linuxosx.libraw_output_params_t.user_qual$set(params$slice, 0); //libraw_output_params_t.output_bps$set(params$slice, 8); //libraw_output_params_t.output_color$set(params$slice, 0); MemorySegment inputStreamBytes = MemorySegment.ofArray(sourceFileAsByteArray); MemorySegment allocateNative = SegmentAllocator.ofScope(scope).allocateArray(C_CHAR, sourceFileAsByteArray); int k = org.libraw.linuxosx.libraw_h.libraw_open_buffer(iprc, allocateNative, inputStreamBytes.byteSize()); if (k > 0) { Logger.getLogger(LibrawImage.class.getName()).log(Level.SEVERE, null, "Cannot open stream, return value was: " + k); throw new IOException("Cannot open file stream!"); } org.libraw.linuxosx.libraw_h.libraw_unpack(iprc); MemoryAddress iParams = org.libraw.linuxosx.libraw_h.libraw_get_iparams(iprc); MemorySegment iParamsRestricted = org.libraw.linuxosx.libraw_iparams_t.ofAddress(iParams, scope); MemorySegment modelSlice = org.libraw.linuxosx.libraw_iparams_t.model$slice(iParamsRestricted); cameraModel = new String(modelSlice.toByteArray(), StandardCharsets.US_ASCII); MemoryAddress image_other_data = org.libraw.linuxosx.libraw_h.libraw_get_imgother(iprc); MemorySegment imageOtherRestricted = org.libraw.linuxosx.libraw_imgother_t.ofAddress(image_other_data, scope); long timestamp = org.libraw.linuxosx.libraw_imgother_t.timestamp$get(imageOtherRestricted); shootingDateTime = LocalDateTime.ofInstant(Instant.ofEpochSecond(timestamp), TimeZone.getDefault().toZoneId()); org.libraw.linuxosx.libraw_h.libraw_dcraw_process(iprc); ByteArrayOutputStream bo = new ByteArrayOutputStream(); MemorySegment errorCode = SegmentAllocator.ofScope(scope).allocate(C_INT.byteSize()); MemoryAddress mem_image_adr = org.libraw.linuxosx.libraw_h.libraw_dcraw_make_mem_image(iprc, errorCode.address()); MemorySegment imageMemSegment = org.libraw.linuxosx.libraw_processed_image_t.ofAddress(mem_image_adr, scope); MemorySegment data$slice = org.libraw.linuxosx.libraw_processed_image_t.data$slice(imageMemSegment); imageWidth = org.libraw.linuxosx.libraw_processed_image_t.width$get(imageMemSegment); Logger.getLogger(LibrawImage.class.getName()).log(Level.FINEST, null, "Native width: " + imageWidth); imageHeight = org.libraw.linuxosx.libraw_processed_image_t.height$get(imageMemSegment); imageBits = org.libraw.linuxosx.libraw_processed_image_t.bits$get(imageMemSegment); imageColors = org.libraw.linuxosx.libraw_processed_image_t.colors$get(imageMemSegment); stride = imageWidth * imageColors * (imageBits / 8); Logger.getLogger(LibrawImage.class.getName()).log(Level.FINEST, null, "Start reading image from native memory..."); byte[] line = new byte[stride]; for (var i = 0; i < imageHeight; i++) { loader.updateImageProgress(i, imageHeight); MemoryAddress addOffset = data$slice.address().addOffset(stride * i); MemorySegment asSegmentRestricted = addOffset.asSegment(stride, scope); line = asSegmentRestricted.toByteArray(); try { bo.write(line); } catch (IOException ex) { Logger.getLogger(LibrawImage.class.getName()).log(Level.SEVERE, "Cannot retrieve image from native memory and write into byte array!", ex); return null; } } bo.flush(); Logger.getLogger(LibrawImage.class.getName()).log(Level.FINEST, null, "Start reading image from native memory...finished"); byte[] data = bo.toByteArray(); bo.close(); Logger.getLogger(LibrawImage.class.getName()).log(Level.FINEST, null, "Freeing of native memory..."); org.libraw.linuxosx.libraw_h.libraw_dcraw_clear_mem(mem_image_adr); mem_image_adr = null; org.libraw.linuxosx.libraw_h.libraw_close(iprc); iprc = null; Logger.getLogger(LibrawImage.class.getName()).log(Level.FINEST, null, "Freeing of native memory...finished"); return data;
Recent comments