From 251c4cadd2708224bcf1774bf7114d44f9ff6c89 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Thu, 2 Jan 2025 23:52:35 +0100 Subject: Add image_from_jpeg(). --- src/lib/image_jpeg.cc | 37 +++++++++++++++++++++++++++++++++++++ src/lib/image_jpeg.h | 4 ++++ 2 files changed, 41 insertions(+) diff --git a/src/lib/image_jpeg.cc b/src/lib/image_jpeg.cc index 28bbb7574..b92be0d9d 100644 --- a/src/lib/image_jpeg.cc +++ b/src/lib/image_jpeg.cc @@ -22,6 +22,7 @@ #include "dcpomatic_assert.h" #include "exceptions.h" #include "image.h" +#include #include #include "i18n.h" @@ -133,3 +134,39 @@ image_as_jpeg (shared_ptr image, int quality) } +shared_ptr +image_from_jpeg(boost::filesystem::path file) +{ + struct jpeg_decompress_struct decompress; + struct jpeg_error_mgr error; + + decompress.err = jpeg_std_error(&error); + error.error_exit = error_exit; + jpeg_create_decompress(&decompress); + + auto data = dcp::ArrayData(file); + jpeg_mem_src(&decompress, data.data(), data.size()); + + jpeg_read_header(&decompress, TRUE); + + jpeg_start_decompress(&decompress); + + DCPOMATIC_ASSERT(decompress.output_components == 3); + + auto output = std::make_shared( + AV_PIX_FMT_RGB24, + dcp::Size{static_cast(decompress.output_width), static_cast(decompress.output_height)}, + Image::Alignment::COMPACT + ); + + while (decompress.output_scanline < decompress.output_height) { + uint8_t* pointers[1] = { output->data()[0] + output->stride()[0] * decompress.output_scanline }; + jpeg_read_scanlines(&decompress, pointers, 1); + } + + jpeg_finish_decompress(&decompress); + jpeg_destroy_decompress(&decompress); + + return output; +} + diff --git a/src/lib/image_jpeg.h b/src/lib/image_jpeg.h index 5c017fc2c..29097680e 100644 --- a/src/lib/image_jpeg.h +++ b/src/lib/image_jpeg.h @@ -19,4 +19,8 @@ */ +class Image; + + +std::shared_ptr image_from_jpeg(boost::filesystem::path file); dcp::ArrayData image_as_jpeg (std::shared_ptr image, int quality); -- cgit v1.2.3