@@ -138,9 +138,11 @@ type openCVDecoder struct {
138138
139139// openCVEncoder implements the Encoder interface for images supported by OpenCV.
140140type openCVEncoder struct {
141- encoder C.opencv_encoder // Native OpenCV encoder
142- dst C.opencv_mat // Destination OpenCV matrix
143- dstBuf []byte // Destination buffer for encoded data
141+ encoder C.opencv_encoder // Native OpenCV encoder
142+ dst C.opencv_mat // Destination OpenCV matrix
143+ dstBuf []byte // Destination buffer for encoded data
144+ icc []byte // ICC color profile from source image
145+ forceSdr bool // Enable HDR to SDR tone mapping
144146}
145147
146148// Depth returns the number of bits in the PixelType.
@@ -762,7 +764,7 @@ func (d *openCVDecoder) SkipFrame() error {
762764 return ErrSkipNotSupported
763765}
764766
765- func newOpenCVEncoder (ext string , decodedBy Decoder , dstBuf []byte ) (* openCVEncoder , error ) {
767+ func newOpenCVEncoder (ext string , decodedBy Decoder , dstBuf []byte , forceSdr bool ) (* openCVEncoder , error ) {
766768 dstBuf = dstBuf [:1 ]
767769 dst := C .opencv_mat_create_empty_from_data (C .int (cap (dstBuf )), unsafe .Pointer (& dstBuf [0 ]))
768770
@@ -777,10 +779,14 @@ func newOpenCVEncoder(ext string, decodedBy Decoder, dstBuf []byte) (*openCVEnco
777779 return nil , ErrInvalidImage
778780 }
779781
782+ icc := decodedBy .ICC ()
783+
780784 return & openCVEncoder {
781- encoder : enc ,
782- dst : dst ,
783- dstBuf : dstBuf ,
785+ encoder : enc ,
786+ dst : dst ,
787+ dstBuf : dstBuf ,
788+ icc : icc ,
789+ forceSdr : forceSdr ,
784790 }, nil
785791}
786792
@@ -797,7 +803,21 @@ func (e *openCVEncoder) Encode(f *Framebuffer, opt map[int]int) ([]byte, error)
797803 if len (optList ) > 0 {
798804 firstOpt = (* C .int )(unsafe .Pointer (& optList [0 ]))
799805 }
800- if ! C .opencv_encoder_write (e .encoder , f .mat , firstOpt , C .size_t (len (optList ))) {
806+
807+ var success bool
808+ if e .forceSdr && len (e .icc ) > 0 {
809+ var iccPtr unsafe.Pointer
810+ if len (e .icc ) > 0 {
811+ iccPtr = unsafe .Pointer (& e .icc [0 ])
812+ }
813+ success = bool (C .opencv_encoder_write_with_tone_mapping (
814+ e .encoder , f .mat , firstOpt , C .size_t (len (optList )),
815+ (* C .uint8_t )(iccPtr ), C .size_t (len (e .icc )), C .bool (true )))
816+ } else {
817+ success = bool (C .opencv_encoder_write (e .encoder , f .mat , firstOpt , C .size_t (len (optList ))))
818+ }
819+
820+ if ! success {
801821 return nil , ErrInvalidImage
802822 }
803823
0 commit comments