From 3ecd63fea0a329ba1cd05c4568dbeec2638b6838 Mon Sep 17 00:00:00 2001 From: emeric Date: Sun, 2 Mar 2025 11:48:27 +0100 Subject: [PATCH] Added a way to probe images from a buffer --- src/libs/image/impl/graphicsmagick/Image.cpp | 23 ++++++++++++++++++++ src/libs/image/impl/stb/Image.cpp | 18 +++++++++++++++ src/libs/image/include/image/Image.hpp | 1 + 3 files changed, 42 insertions(+) diff --git a/src/libs/image/impl/graphicsmagick/Image.cpp b/src/libs/image/impl/graphicsmagick/Image.cpp index 8f4c7605..53e04095 100644 --- a/src/libs/image/impl/graphicsmagick/Image.cpp +++ b/src/libs/image/impl/graphicsmagick/Image.cpp @@ -77,6 +77,29 @@ namespace lms::image } } + ImageProperties probeImage(std::span encodedData) + { + LMS_SCOPED_TRACE_DETAILED("Image", "ProbeBuffer"); + + try + { + Magick::Image image; + Magick::Blob blob{ encodedData.data(), encodedData.size() }; + image.ping(blob); + + ImageProperties properties; + properties.width = image.size().width(); + properties.height = image.size().height(); + + return properties; + } + catch (Magick::Exception& e) + { + LMS_LOG(COVER, ERROR, "Caught Magick exception: " << e.what()); + throw Exception{ std::string{ "Magick probe error: " } + e.what() }; + } + } + std::unique_ptr decodeImage(std::span encodedData) { LMS_SCOPED_TRACE_DETAILED("Image", "DecodeBuffer"); diff --git a/src/libs/image/impl/stb/Image.cpp b/src/libs/image/impl/stb/Image.cpp index ec9432bf..5638cb69 100644 --- a/src/libs/image/impl/stb/Image.cpp +++ b/src/libs/image/impl/stb/Image.cpp @@ -60,6 +60,24 @@ namespace lms::image return properties; } + ImageProperties probeImage(std::span encodedData) + { + LMS_SCOPED_TRACE_DETAILED("Image", "ProbeBuffer"); + + int x{}; + int y{}; + int comp{}; + + if (::stbi_info_from_memory(reinterpret_cast(encodedData.data()), static_cast(encodedData.size()), &x, &y, &comp) == 0) + throw StbiException{ "Probe failed" }; + + ImageProperties properties; + properties.width = x; + properties.height = y; + + return properties; + } + std::unique_ptr decodeImage(std::span encodedData) { LMS_SCOPED_TRACE_DETAILED("Image", "DecodeBuffer"); diff --git a/src/libs/image/include/image/Image.hpp b/src/libs/image/include/image/Image.hpp index 594d78fd..31e46ba8 100644 --- a/src/libs/image/include/image/Image.hpp +++ b/src/libs/image/include/image/Image.hpp @@ -33,6 +33,7 @@ namespace lms::image // All these methods may throw Exception ImageProperties probeImage(const std::filesystem::path& path); + ImageProperties probeImage(std::span encodedData); std::unique_ptr decodeImage(std::span encodedData); std::unique_ptr decodeImage(const std::filesystem::path& path);