mirror of
https://invent.kde.org/frameworks/kimageformats.git
synced 2026-09-14 05:07:00 -04:00
EXR: RGB / YC subtype support
This commit is contained in:
committed by
Mirco Miranda
parent
05af59e819
commit
0862db49b8
@@ -392,6 +392,21 @@ The plugin can set the following additional metadata:
|
|||||||
- `EXRLayerName`: A string containing the name of the EXR layer used to decode
|
- `EXRLayerName`: A string containing the name of the EXR layer used to decode
|
||||||
the image.
|
the image.
|
||||||
|
|
||||||
|
When writing, it is possible to specify compression ratio and quality. The
|
||||||
|
values you can set depend on the version of the OpenEXR library you're using.
|
||||||
|
Please check the [exr_p.h](./src/imageformats/exr_p.h) for more
|
||||||
|
info.
|
||||||
|
|
||||||
|
When writing, it is also possible to specify a subtype:
|
||||||
|
- `RGB` (default): preserves full-resolution color data (R, G, B) without
|
||||||
|
subsampling or loss of chromatic detail.
|
||||||
|
- `YC`: converts RGB data into luminance (Y) and 2x2 subsampled chroma
|
||||||
|
(RY, BY), cutting raw color data by ~50% for significantly smaller file
|
||||||
|
sizes.
|
||||||
|
|
||||||
|
> [!note]
|
||||||
|
> When writing grayscale images, the subtype makes no difference.
|
||||||
|
|
||||||
### The EPS plugin
|
### The EPS plugin
|
||||||
|
|
||||||
The plugin uses `Ghostscript` to convert the raster image. When reading it
|
The plugin uses `Ghostscript` to convert the raster image. When reading it
|
||||||
|
|||||||
@@ -200,12 +200,17 @@ void K_OStream::seekg(Imf::Int64 pos)
|
|||||||
m_dev->seek(pos);
|
m_dev->seek(pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define EXR_SUBFORMAT_RGB QByteArray("RGB")
|
||||||
|
|
||||||
|
#define EXR_SUBFORMAT_YC QByteArray("YC")
|
||||||
|
|
||||||
EXRHandler::EXRHandler()
|
EXRHandler::EXRHandler()
|
||||||
: m_compressionRatio(-1)
|
: m_compressionRatio(-1)
|
||||||
, m_quality(-1)
|
, m_quality(-1)
|
||||||
, m_imageNumber(0)
|
, m_imageNumber(0)
|
||||||
, m_imageCount(0)
|
, m_imageCount(0)
|
||||||
, m_startPos(-1)
|
, m_startPos(-1)
|
||||||
|
, m_subType(EXR_SUBFORMAT_RGB)
|
||||||
{
|
{
|
||||||
// Set the number of threads to use (0 is allowed)
|
// Set the number of threads to use (0 is allowed)
|
||||||
Imf::setGlobalThreadCount(QThread::idealThreadCount() / 2);
|
Imf::setGlobalThreadCount(QThread::idealThreadCount() / 2);
|
||||||
@@ -688,6 +693,9 @@ bool EXRHandler::write(const QImage &image)
|
|||||||
// write the EXR
|
// write the EXR
|
||||||
K_OStream ostr(device());
|
K_OStream ostr(device());
|
||||||
auto channelsType = image.hasAlphaChannel() ? Imf::RgbaChannels::WRITE_RGBA : Imf::RgbaChannels::WRITE_RGB;
|
auto channelsType = image.hasAlphaChannel() ? Imf::RgbaChannels::WRITE_RGBA : Imf::RgbaChannels::WRITE_RGB;
|
||||||
|
if (m_subType == EXR_SUBFORMAT_YC) {
|
||||||
|
channelsType = channelsType == Imf::RgbaChannels::WRITE_RGBA ? Imf::RgbaChannels::WRITE_YCA : Imf::RgbaChannels::WRITE_YC;
|
||||||
|
}
|
||||||
if (image.format() == QImage::Format_Mono ||
|
if (image.format() == QImage::Format_Mono ||
|
||||||
image.format() == QImage::Format_MonoLSB ||
|
image.format() == QImage::Format_MonoLSB ||
|
||||||
image.format() == QImage::Format_Grayscale16 ||
|
image.format() == QImage::Format_Grayscale16 ||
|
||||||
@@ -743,6 +751,15 @@ void EXRHandler::setOption(ImageOption option, const QVariant &value)
|
|||||||
m_quality = q;
|
m_quality = q;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (option == QImageIOHandler::SubType) {
|
||||||
|
auto subType = value.toByteArray();
|
||||||
|
auto list = EXRHandler::option(QImageIOHandler::SupportedSubTypes).value<QList<QByteArray>>();
|
||||||
|
if (list.contains(subType)) {
|
||||||
|
m_subType = subType;
|
||||||
|
} else {
|
||||||
|
m_subType = EXR_SUBFORMAT_RGB;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool EXRHandler::supportsOption(ImageOption option) const
|
bool EXRHandler::supportsOption(ImageOption option) const
|
||||||
@@ -761,6 +778,12 @@ bool EXRHandler::supportsOption(ImageOption option) const
|
|||||||
if (option == QImageIOHandler::Quality) {
|
if (option == QImageIOHandler::Quality) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
if (option == QImageIOHandler::SubType) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (option == QImageIOHandler::SupportedSubTypes) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -815,6 +838,14 @@ QVariant EXRHandler::option(ImageOption option) const
|
|||||||
v = QVariant(m_quality);
|
v = QVariant(m_quality);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (option == QImageIOHandler::SupportedSubTypes) {
|
||||||
|
return QVariant::fromValue(QList<QByteArray>() << EXR_SUBFORMAT_RGB << EXR_SUBFORMAT_YC);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (option == QImageIOHandler::SubType) {
|
||||||
|
return QVariant::fromValue(m_subType);
|
||||||
|
}
|
||||||
|
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -118,6 +118,14 @@ private:
|
|||||||
* The initial device position to allow multi image load (cache value).
|
* The initial device position to allow multi image load (cache value).
|
||||||
*/
|
*/
|
||||||
qint64 m_startPos;
|
qint64 m_startPos;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \brief m_subType
|
||||||
|
* The EXR subtype to use when writing:
|
||||||
|
* - RGB: preserves full-resolution color data (R, G, B) without subsampling or loss of chromatic detail (default).
|
||||||
|
* - YC: converts RGB data into luminance (Y) and 2x2 subsampled chroma (RY, BY), cutting raw color data by ~50% for significantly smaller file sizes.
|
||||||
|
*/
|
||||||
|
QByteArray m_subType;
|
||||||
};
|
};
|
||||||
|
|
||||||
class EXRPlugin : public QImageIOPlugin
|
class EXRPlugin : public QImageIOPlugin
|
||||||
|
|||||||
Reference in New Issue
Block a user