From ac3591c7ea5a5be3699f6d9495d1fae1e4f7e22a Mon Sep 17 00:00:00 2001 From: Mirco Miranda Date: Wed, 15 Jan 2025 08:41:10 +0100 Subject: [PATCH] PSD: added support to EXIF metadata --- autotests/read/jxl/gimp_exif.jxl.json | 8 ++-- autotests/read/psd/mch-16bits.psd.json | 16 ++++++- autotests/read/psd/mch-8bits.psd.json | 16 ++++++- autotests/read/psd/metadata.png | Bin 0 -> 21880 bytes autotests/read/psd/metadata.psd | Bin 0 -> 70115 bytes autotests/read/psd/metadata.psd.json | 59 +++++++++++++++++++++++++ autotests/templateimage.cpp | 4 +- src/imageformats/CMakeLists.txt | 2 +- src/imageformats/psd.cpp | 29 +++++++++++- 9 files changed, 124 insertions(+), 10 deletions(-) create mode 100644 autotests/read/psd/metadata.png create mode 100644 autotests/read/psd/metadata.psd create mode 100644 autotests/read/psd/metadata.psd.json diff --git a/autotests/read/jxl/gimp_exif.jxl.json b/autotests/read/jxl/gimp_exif.jxl.json index 0b115c7..aefe7c4 100644 --- a/autotests/read/jxl/gimp_exif.jxl.json +++ b/autotests/read/jxl/gimp_exif.jxl.json @@ -3,12 +3,12 @@ "fileName" : "gimp_exif.png", "metadata" : [ { - "Key" : "CreationDate", - "Value" : "2025-01-05T10:18:16" + "key" : "CreationDate", + "value" : "2025-01-05T10:18:16" }, { - "Key" : "Software" , - "Value" : "GIMP 3.0.0-RC2" + "key" : "Software" , + "value" : "GIMP 3.0.0-RC2" } ], "resolution" : { diff --git a/autotests/read/psd/mch-16bits.psd.json b/autotests/read/psd/mch-16bits.psd.json index 8d63adc..92bcd3e 100644 --- a/autotests/read/psd/mch-16bits.psd.json +++ b/autotests/read/psd/mch-16bits.psd.json @@ -1,7 +1,21 @@ [ { "minQtVersion" : "6.8.0", - "fileName" : "mch-16bits_qt_6_8.tif" + "fileName" : "mch-16bits_qt_6_8.tif", + "resolution" : { + "dotsPerMeterX" : 4685, + "dotsPerMeterY" : 4685 + }, + "metadata" : [ + { + "key" : "CreationDate", + "value" : "2022-11-11T14:27:52" + }, + { + "key" : "Software", + "value" : "Adobe Photoshop 24.0 (Windows)" + } + ] }, { "minQtVersion" : "6.0.0", diff --git a/autotests/read/psd/mch-8bits.psd.json b/autotests/read/psd/mch-8bits.psd.json index 3a253cb..e4f488e 100644 --- a/autotests/read/psd/mch-8bits.psd.json +++ b/autotests/read/psd/mch-8bits.psd.json @@ -1,7 +1,21 @@ [ { "minQtVersion" : "6.8.0", - "fileName" : "mch-8bits_qt_6.8.tif" + "fileName" : "mch-8bits_qt_6.8.tif", + "resolution" : { + "dotsPerMeterX" : 4685, + "dotsPerMeterY" : 4685 + }, + "metadata" : [ + { + "key" : "CreationDate", + "value" : "2022-11-11T14:27:39" + }, + { + "key" : "Software", + "value" : "Adobe Photoshop 24.0 (Windows)" + } + ] }, { "minQtVersion" : "6.0.0", diff --git a/autotests/read/psd/metadata.png b/autotests/read/psd/metadata.png new file mode 100644 index 0000000000000000000000000000000000000000..aaa87258894d46caa6d7cd71819c1b83ccf5dc26 GIT binary patch literal 21880 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 SPDX-FileCopyrightText: 2015 Alex Merry - SPDX-FileCopyrightText: 2022-2024 Mirco Miranda + SPDX-FileCopyrightText: 2022-2025 Mirco Miranda SPDX-License-Identifier: LGPL-2.0-or-later */ @@ -27,6 +27,7 @@ */ #include "fastmath_p.h" +#include "microexif_p.h" #include "psd_p.h" #include "scanlineconverter_p.h" #include "util_p.h" @@ -96,6 +97,8 @@ enum ImageResourceId : quint16 { IRI_ICCPROFILE = 0x040F, IRI_TRANSPARENCYINDEX = 0x0417, IRI_VERSIONINFO = 0x0421, + IRI_EXIFDATA1 = 0x0422, + IRI_EXIFDATA3 = 0x0423, // never seen IRI_XMPMETADATA = 0x0424 }; @@ -522,6 +525,25 @@ static bool setXmpData(QImage& img, const PSDImageResourceSection& irs) return true; } +/*! + * \brief setExifData + * Adds EXIF metadata to QImage. + * \param img The image. + * \param irs The image resource section. + * \return True on success, otherwise false. + */ +static bool setExifData(QImage& img, const PSDImageResourceSection& irs) +{ + if (!irs.contains(IRI_EXIFDATA1)) + return false; + auto irb = irs.value(IRI_EXIFDATA1); + auto exif = MicroExif::fromByteArray(irb.data); + if (exif.isEmpty()) + return false; + exif.toImageMetadata(img); + return true; +} + /*! * \brief hasMergedData * Checks if merged image data are available. @@ -1356,6 +1378,11 @@ static bool LoadPSD(QDataStream &stream, const PSDHeader &header, QImage &img) // qDebug() << "No XMP data found!"; } + // EXIF data + if (!setExifData(img, irs)) { + // qDebug() << "No EXIF data found!"; + } + // Duotone images: color data contains the duotone specification (not documented). // Other applications that read Photoshop files can treat a duotone image as a gray image, // and just preserve the contents of the duotone information when reading and writing the file.