File indexing completed on 2024-06-23 05:18:30
0001 /* 0002 SPDX-FileCopyrightText: 2012-2024 Laurent Montel <montel@kde.org> 0003 0004 SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #include "imagescaling.h" 0008 #include "settings/messagecomposersettings.h" 0009 #include <QBuffer> 0010 #include <QImage> 0011 using namespace MessageComposer; 0012 0013 class MessageComposer::ImageScalingPrivate 0014 { 0015 public: 0016 ImageScalingPrivate() = default; 0017 0018 QImage mImage; 0019 QBuffer mBuffer; 0020 QString mName; 0021 QByteArray mMimeType; 0022 }; 0023 0024 ImageScaling::ImageScaling() 0025 : d(new MessageComposer::ImageScalingPrivate) 0026 { 0027 } 0028 0029 ImageScaling::~ImageScaling() = default; 0030 0031 bool ImageScaling::loadImageFromData(const QByteArray &data) 0032 { 0033 if (!d->mImage.loadFromData(data)) { 0034 return false; 0035 } 0036 return true; 0037 } 0038 0039 bool ImageScaling::resizeImage() 0040 { 0041 if (d->mImage.isNull()) { 0042 return false; 0043 } 0044 const int width = d->mImage.width(); 0045 const int height = d->mImage.height(); 0046 int newWidth = -1; 0047 int newHeight = -1; 0048 if (MessageComposer::MessageComposerSettings::self()->reduceImageToMaximum()) { 0049 int maximumWidth = MessageComposer::MessageComposerSettings::self()->maximumWidth(); 0050 if (maximumWidth == -1) { 0051 maximumWidth = MessageComposer::MessageComposerSettings::self()->customMaximumWidth(); 0052 } 0053 int maximumHeight = MessageComposer::MessageComposerSettings::self()->maximumHeight(); 0054 if (maximumHeight == -1) { 0055 maximumHeight = MessageComposer::MessageComposerSettings::self()->customMaximumHeight(); 0056 } 0057 if (width > maximumWidth) { 0058 newWidth = maximumWidth; 0059 } else { 0060 newWidth = width; 0061 } 0062 if (height > maximumHeight) { 0063 newHeight = maximumHeight; 0064 } else { 0065 newHeight = height; 0066 } 0067 } else { 0068 newHeight = height; 0069 newWidth = width; 0070 } 0071 if (MessageComposer::MessageComposerSettings::self()->enlargeImageToMinimum()) { 0072 int minimumWidth = MessageComposer::MessageComposerSettings::self()->minimumWidth(); 0073 if (minimumWidth == -1) { 0074 minimumWidth = MessageComposer::MessageComposerSettings::self()->customMinimumWidth(); 0075 } 0076 0077 int minimumHeight = MessageComposer::MessageComposerSettings::self()->minimumHeight(); 0078 if (minimumHeight == -1) { 0079 minimumHeight = MessageComposer::MessageComposerSettings::self()->customMinimumHeight(); 0080 } 0081 if (newWidth < minimumWidth) { 0082 newWidth = minimumWidth; 0083 } 0084 if (newHeight < minimumHeight) { 0085 newHeight = minimumHeight; 0086 } 0087 } 0088 if ((newHeight != height) || (newWidth != width)) { 0089 d->mBuffer.open(QIODevice::WriteOnly); 0090 d->mImage = d->mImage.scaled(newWidth, 0091 newHeight, 0092 MessageComposer::MessageComposerSettings::self()->keepImageRatio() ? Qt::KeepAspectRatio : Qt::IgnoreAspectRatio); 0093 0094 QByteArray format; 0095 if (d->mMimeType == QByteArrayLiteral("image/jpeg")) { 0096 format = QByteArrayLiteral("JPG"); 0097 } else if (d->mMimeType == QByteArrayLiteral("image/png")) { 0098 format = QByteArrayLiteral("PNG"); 0099 } else { 0100 format = MessageComposer::MessageComposerSettings::self()->writeFormat().toLocal8Bit(); 0101 if (format.isEmpty()) { 0102 format = QByteArrayLiteral("PNG"); 0103 } 0104 } 0105 const bool result = d->mImage.save(&d->mBuffer, format.constData()); 0106 d->mBuffer.close(); 0107 return result; 0108 } else { 0109 return false; 0110 } 0111 return true; 0112 } 0113 0114 QByteArray ImageScaling::mimetype() const 0115 { 0116 if (d->mMimeType.isEmpty()) { 0117 return {}; 0118 } 0119 if ((d->mMimeType == QByteArrayLiteral("image/jpeg")) || (d->mMimeType == QByteArrayLiteral("image/png"))) { 0120 return d->mMimeType; 0121 } else { 0122 // Add more mimetype if a day we add more saving format. 0123 const QString type = MessageComposer::MessageComposerSettings::self()->writeFormat(); 0124 if (type == QLatin1StringView("JPG")) { 0125 return QByteArrayLiteral("image/jpeg"); 0126 } else { 0127 return QByteArrayLiteral("image/png"); 0128 } 0129 } 0130 } 0131 0132 void ImageScaling::setMimetype(const QByteArray &mimetype) 0133 { 0134 d->mMimeType = mimetype; 0135 } 0136 0137 void ImageScaling::setName(const QString &name) 0138 { 0139 d->mName = name; 0140 } 0141 0142 QByteArray ImageScaling::imageArray() const 0143 { 0144 return d->mBuffer.data(); 0145 } 0146 0147 QString ImageScaling::generateNewName() 0148 { 0149 if (d->mName.isEmpty()) { 0150 return {}; 0151 } 0152 0153 // Don't rename it. 0154 if ((d->mMimeType == QByteArrayLiteral("image/jpeg")) || (d->mMimeType == QByteArrayLiteral("image/png"))) { 0155 return d->mName; 0156 } 0157 QString type = MessageComposer::MessageComposerSettings::self()->writeFormat(); 0158 if (type.isEmpty()) { 0159 type = QStringLiteral("PNG"); 0160 } 0161 if (d->mName.endsWith(QLatin1StringView(".png"))) { 0162 if (type != QLatin1StringView("PNG")) { 0163 d->mName.replace(QLatin1StringView(".png"), QLatin1StringView(".jpg")); 0164 } 0165 } else if (d->mName.endsWith(QLatin1StringView(".jpg"))) { 0166 if (type != QLatin1StringView("JPG")) { 0167 d->mName.replace(QLatin1StringView(".jpg"), QLatin1StringView(".png")); 0168 } 0169 } else { 0170 if (type == QLatin1StringView("PNG")) { 0171 d->mName += QLatin1StringView(".png"); 0172 } else { 0173 d->mName += QLatin1StringView(".jpg"); 0174 } 0175 } 0176 return d->mName; 0177 }