Hack to fix image luminance when cropping subsampled images (#1872). v2.14.44
authorCarl Hetherington <cth@carlh.net>
Thu, 19 Nov 2020 21:07:39 +0000 (22:07 +0100)
committerCarl Hetherington <cth@carlh.net>
Thu, 19 Nov 2020 21:08:21 +0000 (22:08 +0100)
Without this the luminance varies slightly as you crop by odd and
even amounts (for YUV420 images).

src/lib/image.cc

index 1a5b11ecb085e9f32c2852304b3e76c8a9cae454..97aeccd7679e099b02831ae11ce1c9aa210b33b6 100644 (file)
@@ -183,6 +183,14 @@ Image::crop_scale_window (
        /* Size of the image after any crop */
        dcp::Size const cropped_size = rounded_crop.apply (size());
 
+       /* Hack: if we're not doing quite the crop that we were asked for, and we carry on scaling
+        * to the inter_size we were asked for, there is a small but noticeable wobble in the image
+        * luminance (#1872).  This hack means we will jump in steps of the subsampling distance
+        * in both crop and scale.
+        */
+       inter_size.width = round_width_for_subsampling(inter_size.width, in_desc);
+       inter_size.height = round_width_for_subsampling(inter_size.height, in_desc);
+
        /* Scale context for a scale from cropped_size to inter_size */
        struct SwsContext* scale_context = sws_getContext (
                        cropped_size.width, cropped_size.height, pixel_format(),