Skip to content

Commit 797b229

Browse files
add-uosdeepin-bot[bot]
authored andcommitted
fix(ui): scale large images and preserve original dimensions
Detect large images exceeding 4096px in either dimension and scale them down while maintaining aspect ratio for performance optimization. Store original dimensions in metadata and display them in the information dialog when available, falling back to scaled dimensions when original data is not present. log: scale large images and preserve original dimensions bug: https://pms.uniontech.com/bug-view-333195.html
1 parent a00745b commit 797b229

File tree

2 files changed

+53
-4
lines changed

2 files changed

+53
-4
lines changed

src/qml/PreviewImageViewer/InformationDialog/InformationDialog.qml

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,14 @@ DialogWindow {
109109
PropertyItemDelegate {
110110
Layout.fillWidth: true
111111
contrlImplicitWidth: propMidWidth
112-
description: dimensionsStr
112+
description: {
113+
var originalDim = FileControl.slotGetInfo("OriginalDimension", filePath);
114+
if (originalDim && originalDim !== "-") {
115+
return originalDim;
116+
} else {
117+
return dimensionsStr;
118+
}
119+
}
113120
title: qsTr("Dimensions")
114121
}
115122

src/src/unionimage/unionimage.cpp

Lines changed: 45 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -403,6 +403,23 @@ UNIONIMAGESHARED_EXPORT bool loadStaticImageFromFile(const QString &path, QImage
403403
reader.setFormat(format_bar.toLatin1());
404404
}
405405
reader.setAutoTransform(true);
406+
407+
// 增加内存限制,支持加载大图片
408+
reader.setAllocationLimit(2048);
409+
qDebug() << "Set QImageReader allocation limit to 2048MB";
410+
411+
QSize originalSize = reader.size();
412+
const int maxDimension = 4096;
413+
if (originalSize.width() > maxDimension || originalSize.height() > maxDimension) {
414+
qDebug() << "Large image detected (" << originalSize.width() << "x" << originalSize.height()
415+
<< "), scaling down to max dimension:" << maxDimension;
416+
417+
QSize scaledSize = originalSize;
418+
scaledSize.scale(maxDimension, maxDimension, Qt::KeepAspectRatio);
419+
reader.setScaledSize(scaledSize);
420+
qDebug() << "Image scaled to:" << scaledSize;
421+
}
422+
406423
if (reader.imageCount() > 0 || file_suffix_upper != "ICNS") {
407424
res_qt = reader.read();
408425
if (res_qt.isNull()) {
@@ -767,10 +784,35 @@ UNIONIMAGESHARED_EXPORT QMap<QString, QString> getAllMetaData(const QString &pat
767784
}
768785
admMap.insert("DateTimeDigitized", info.lastModified().toString("yyyy/MM/dd HH:mm"));
769786

770-
// The value of width and height might incorrect
787+
// The value of width and height might incorrect
771788
QImageReader reader(path);
772-
int w = reader.size().width();
773-
int h = reader.size().height();
789+
790+
// 增加内存限制,支持读取大图片的元数据
791+
reader.setAllocationLimit(2048);
792+
qDebug() << "Set QImageReader allocation limit to 2048MB for metadata reading";
793+
794+
QSize originalSize = reader.size();
795+
const int maxDimension = 4096;
796+
int w = originalSize.width();
797+
int h = originalSize.height();
798+
799+
if (originalSize.width() > maxDimension || originalSize.height() > maxDimension) {
800+
qDebug() << "Large image detected for metadata reading (" << originalSize.width() << "x" << originalSize.height()
801+
<< "), scaling down to max dimension:" << maxDimension;
802+
803+
QSize scaledSize = originalSize;
804+
scaledSize.scale(maxDimension, maxDimension, Qt::KeepAspectRatio);
805+
806+
admMap.insert("OriginalDimension", QString::number(w) + "x" + QString::number(h));
807+
admMap.insert("OriginalWidth", QString::number(w));
808+
admMap.insert("OriginalHeight", QString::number(h));
809+
810+
w = scaledSize.width();
811+
h = scaledSize.height();
812+
813+
qDebug() << "Image scaled for metadata to:" << scaledSize;
814+
}
815+
774816
admMap.insert("Dimension", QString::number(w) + "x" + QString::number(h));
775817
// 记录图片宽高
776818
admMap.insert("Width", QString::number(w));

0 commit comments

Comments
 (0)