Added a way to probe images from a buffer

This commit is contained in:
emeric
2025-03-02 11:48:27 +01:00
parent 373ee8f0be
commit 3ecd63fea0
3 changed files with 42 additions and 0 deletions
@@ -77,6 +77,29 @@ namespace lms::image
}
}
ImageProperties probeImage(std::span<const std::byte> 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<IRawImage> decodeImage(std::span<const std::byte> encodedData)
{
LMS_SCOPED_TRACE_DETAILED("Image", "DecodeBuffer");
+18
View File
@@ -60,6 +60,24 @@ namespace lms::image
return properties;
}
ImageProperties probeImage(std::span<const std::byte> encodedData)
{
LMS_SCOPED_TRACE_DETAILED("Image", "ProbeBuffer");
int x{};
int y{};
int comp{};
if (::stbi_info_from_memory(reinterpret_cast<const stbi_uc*>(encodedData.data()), static_cast<int>(encodedData.size()), &x, &y, &comp) == 0)
throw StbiException{ "Probe failed" };
ImageProperties properties;
properties.width = x;
properties.height = y;
return properties;
}
std::unique_ptr<IRawImage> decodeImage(std::span<const std::byte> encodedData)
{
LMS_SCOPED_TRACE_DETAILED("Image", "DecodeBuffer");
+1
View File
@@ -33,6 +33,7 @@ namespace lms::image
// All these methods may throw Exception
ImageProperties probeImage(const std::filesystem::path& path);
ImageProperties probeImage(std::span<const std::byte> encodedData);
std::unique_ptr<IRawImage> decodeImage(std::span<const std::byte> encodedData);
std::unique_ptr<IRawImage> decodeImage(const std::filesystem::path& path);