From 276338199ab2e3acbb15ebe8c1aabb1c833a4c74 Mon Sep 17 00:00:00 2001 From: Mirco Miranda Date: Tue, 14 Apr 2026 17:46:40 +0200 Subject: [PATCH] EXR: fix incorrect loading of EXR files saved by Photoshop 2026 --- README.md | 4 + autotests/read/exr/ps2026_testcard_rgb.exr | Bin 0 -> 69092 bytes .../read/exr/ps2026_testcard_rgb.exr.json | 15 ++++ autotests/read/exr/ps2026_testcard_rgb.png | Bin 0 -> 11484 bytes autotests/read/exr/rgb-gimp.exr.json | 2 +- src/imageformats/exr.cpp | 85 +++++++++++++----- src/imageformats/exr_p.h | 2 + 7 files changed, 83 insertions(+), 25 deletions(-) create mode 100644 autotests/read/exr/ps2026_testcard_rgb.exr create mode 100644 autotests/read/exr/ps2026_testcard_rgb.exr.json create mode 100644 autotests/read/exr/ps2026_testcard_rgb.png diff --git a/README.md b/README.md index 383c700..774ec18 100644 --- a/README.md +++ b/README.md @@ -324,6 +324,10 @@ plugin: attribute named "xmp". Note that Gimp reads the "xmp" attribute and Darktable writes it as well. +The plugin can set the following additional metadata: +- `EXRLayerName`: A string containing the name of the EXR layer used to decode + the image. + ### The EPS plugin The plugin uses `Ghostscript` to convert the raster image. When reading it diff --git a/autotests/read/exr/ps2026_testcard_rgb.exr b/autotests/read/exr/ps2026_testcard_rgb.exr new file mode 100644 index 0000000000000000000000000000000000000000..5eb0a574286d0b694a7c18ec5e5d1058d8157a43 GIT binary patch literal 69092 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 I$eV@!AEeQ;M*si- literal 0 HcmV?d00001 diff --git a/autotests/read/exr/rgb-gimp.exr.json b/autotests/read/exr/rgb-gimp.exr.json index f424125..be3dc90 100644 --- a/autotests/read/exr/rgb-gimp.exr.json +++ b/autotests/read/exr/rgb-gimp.exr.json @@ -2,7 +2,7 @@ { "fileName" : "rgb-gimp.png", "colorSpace" : { - "description" : "", + "description" : "Embedded RGB (linear)", "primaries" : "Custom", "transferFunction" : "Linear", "gamma" : 1 diff --git a/src/imageformats/exr.cpp b/src/imageformats/exr.cpp index c6b6f16..3cedc32 100644 --- a/src/imageformats/exr.cpp +++ b/src/imageformats/exr.cpp @@ -58,6 +58,7 @@ #include #include #include +#include #include #include #include @@ -227,8 +228,9 @@ static QImage::Format imageFormat(const Imf::RgbaInputFile &file) /*! * \brief viewList - * \param header + * \param header The image header. * \return The list of available views. + * \note This plugin does not support compositing layers which are returned as single images. */ static QStringList viewList(const Imf::Header &h) { @@ -238,14 +240,44 @@ static QStringList viewList(const Imf::Header &h) l << QString::fromStdString(v); } } + if (l.isEmpty()) { + // Recent versions of Photoshop save images by setting the layer. + // Channels are named Layer 1.A, Layer 1.B, etc., so I have to set + // the layer or the images will appear black. + auto channels = h.channels(); + for (auto i = channels.begin(); i != channels.end(); ++i) { + auto name = QString::fromLatin1(i.name(), -1); + auto idx = name.indexOf(QChar(u'.')); + if (idx > -1) + l << name.left(idx); + } + l.removeDuplicates(); + } return l; } +static QString setLayerName(Imf::RgbaInputFile &file, qint32 imageNumber = -1) +{ + // set the image to load + QString layerName; + auto &&header = file.header(); + if (imageNumber > -1) { + auto views = viewList(header); + if (imageNumber < views.count()) + layerName = views.at(imageNumber); + } + // set the layer name + if (!layerName.isEmpty()) { + file.setLayerName(layerName.toStdString()); + } + return layerName; +} + #ifdef QT_DEBUG static void printAttributes(const Imf::Header &h) { for (auto i = h.begin(); i != h.end(); ++i) { - qCDebug(LOG_EXRPLUGIN) << i.name(); + qCDebug(LOG_EXRPLUGIN) << i.name() << i.attribute().typeName(); } } #endif @@ -340,15 +372,29 @@ static void readColorSpace(const Imf::Header &header, QImage &image) { // final color operations QColorSpace cs; - if (auto chroma = header.findTypedAttribute("chromaticities")) { - auto &&v = chroma->value(); - cs = QColorSpace(QPointF(v.white.x, v.white.y), - QPointF(v.red.x, v.red.y), - QPointF(v.green.x, v.green.y), - QPointF(v.blue.x, v.blue.y), - QColorSpace::TransferFunction::Linear); + + // Photoshop 2026 allow to save the ICC profile as "iccProfile" attribute + if (auto iccProfile = header.findTypedAttribute("iccProfile")) { + auto &&v = iccProfile->data(); + cs = QColorSpace::fromIccProfile(QByteArray::fromRawData(v, v.size())); } + if (!cs.isValid()) { + // Creating the ICC profile from Chromaticities + if (auto chroma = header.findTypedAttribute("chromaticities")) { + auto &&v = chroma->value(); + cs = QColorSpace(QPointF(v.white.x, v.white.y), + QPointF(v.red.x, v.red.y), + QPointF(v.green.x, v.green.y), + QPointF(v.blue.x, v.blue.y), + QColorSpace::TransferFunction::Linear); + if (cs.isValid()) + cs.setDescription(QStringLiteral("Embedded RGB (linear)")); + } + } + + if (!cs.isValid()) { + // Use a linear profile cs = QColorSpace(QColorSpace::SRgbLinear); } image.setColorSpace(cs); @@ -377,12 +423,7 @@ bool EXRHandler::read(QImage *outImage) auto &&header = file.header(); // set the image to load - if (m_imageNumber > -1) { - auto views = viewList(header); - if (m_imageNumber < views.count()) { - file.setLayerName(views.at(m_imageNumber).toStdString()); - } - } + auto layerName = setLayerName(file, m_imageNumber); // get image info Imath::Box2i dw = file.dataWindow(); @@ -401,6 +442,9 @@ bool EXRHandler::read(QImage *outImage) qCWarning(LOG_EXRPLUGIN) << "Failed to allocate image, invalid size?" << QSize(width, height); return false; } + if (!layerName.isEmpty()) { + image.setText(QStringLiteral("EXRLayerName"), layerName); + } Imf::Array2D pixels; pixels.resizeErase(EXR_LINES_PER_BLOCK, width); @@ -688,12 +732,7 @@ QVariant EXRHandler::option(ImageOption option) const try { K_IStream istr(d); Imf::RgbaInputFile file(istr); - if (m_imageNumber > -1) { // set the image to read - auto views = viewList(file.header()); - if (m_imageNumber < views.count()) { - file.setLayerName(views.at(m_imageNumber).toStdString()); - } - } + setLayerName(file, m_imageNumber); Imath::Box2i dw = file.dataWindow(); v = QVariant(QSize(dw.max.x - dw.min.x + 1, dw.max.y - dw.min.y + 1)); } catch (const std::exception &) { @@ -713,6 +752,7 @@ QVariant EXRHandler::option(ImageOption option) const try { K_IStream istr(d); Imf::RgbaInputFile file(istr); + setLayerName(file, m_imageNumber); v = QVariant::fromValue(imageFormat(file)); } catch (const std::exception &) { // broken file or unsupported version @@ -787,12 +827,9 @@ bool EXRHandler::canRead(QIODevice *device) return false; } -#if OPENEXR_VERSION_MAJOR == 3 && OPENEXR_VERSION_MINOR > 2 - // openexpr >= 3.3 uses seek and tell extensively if (device->isSequential()) { return false; } -#endif const QByteArray head = device->peek(4); diff --git a/src/imageformats/exr_p.h b/src/imageformats/exr_p.h index 031cb02..fb202c8 100644 --- a/src/imageformats/exr_p.h +++ b/src/imageformats/exr_p.h @@ -86,6 +86,8 @@ private: * - 7: lossy 4-by-4 pixel block compression, fields are compressed more * - 8: lossy DCT based compression, in blocks of 32 scanlines. More efficient for partial buffer access. * - 9: lossy DCT based compression, in blocks of 256 scanlines. More efficient space wise and faster to decode full frames than DWAA_COMPRESSION. + * - 10: High-Throughput JPEG2000 (HTJ2K), 256 scanlines (requires OpenEXR 3.4+). + * - 11: High-Throughput JPEG2000 (HTJ2K), 32 scanlines (requires OpenEXR 3.4+). */ qint32 m_compressionRatio;