From c984f807703fb113c3e53d9a61d38e1cc83bf196 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Tue, 12 Mar 2019 23:16:03 +0000 Subject: [PATCH] Fix R/B swap with as_png(); support as_png() for any pixel format. --- src/lib/image.cc | 4 +++- test/image_test.cc | 12 ++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/lib/image.cc b/src/lib/image.cc index f005e3f63..95cb93b65 100644 --- a/src/lib/image.cc +++ b/src/lib/image.cc @@ -1248,7 +1248,9 @@ Image::as_png () const { DCPOMATIC_ASSERT (bytes_per_pixel(0) == 4); DCPOMATIC_ASSERT (planes() == 1); - DCPOMATIC_ASSERT (pixel_format() == AV_PIX_FMT_BGRA); + if (pixel_format() != AV_PIX_FMT_RGBA) { + return convert_pixel_format(dcp::YUV_TO_RGB_REC709, AV_PIX_FMT_RGBA, true, false)->as_png(); + } /* error handling? */ png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, reinterpret_cast(const_cast(this)), png_error_fn, 0); diff --git a/test/image_test.cc b/test/image_test.cc index 9d07f8a0a..2bbe9d14b 100644 --- a/test/image_test.cc +++ b/test/image_test.cc @@ -266,3 +266,15 @@ BOOST_AUTO_TEST_CASE (crop_scale_window_test) write_image(save, "build/test/crop_scale_window_test.png", "RGB"); check_image("test/data/crop_scale_window_test.png", "build/test/crop_scale_window_test.png"); } + +BOOST_AUTO_TEST_CASE (as_png_test) +{ + shared_ptr proxy(new FFmpegImageProxy("test/data/3d_test/000001.png")); + shared_ptr image_rgb = proxy->image().first; + shared_ptr image_bgr = image_rgb->convert_pixel_format(dcp::YUV_TO_RGB_REC709, AV_PIX_FMT_BGRA, true, false); + image_rgb->as_png().write ("build/test/as_png_rgb.png"); + image_bgr->as_png().write ("build/test/as_png_bgr.png"); + + check_image ("test/data/3d_test/000001.png", "build/test/as_png_rgb.png"); + check_image ("test/data/3d_test/000001.png", "build/test/as_png_bgr.png"); +} -- 2.30.2