問題代碼
// 縮小
float x = pix.height(), y = pix.width();
pix = pix.scaled(x/1.5, y/1.5, Qt::KeepAspectRatio);
// 放大
x = pix.height(); y = pix.width();
pix = pix.scaled(x*1.5, y*1.5, Qt::KeepAspectRatio);
錯誤分析
scaled 回傳**新 QPixmap**,原物件不變。
- 連續縮放會累積**浮點誤差**與**整數像素截斷**,導致尺寸逐漸偏離原始值。
- 邏輯上「縮小 1.5 倍再放大 1.5 倍」≠ 原尺寸(
(W/1.5)*1.5 ≠ W 因整數除法截斷)。
正確做法
- 保存原始圖片:
QPixmap original = ...; 所有縮放基於 original 計算目標尺寸。
- 使用縮放因子累乘:維護
qreal scaleFactor = 1.0;,縮小 scaleFactor /= 1.5,放大 scaleFactor *= 1.5,每次 original.scaled(original.width()*scaleFactor, ...)。
- 或用 QTransform:
QTransform t; t.scale(scaleFactor, scaleFactor); pix = original.transformed(t); 品質更好。
代碼修正
// 成員變數
QPixmap m_original;
qreal m_scale = 1.0;
// 縮小
m_scale /= 1.5;
ui->board2->setPixmap(m_original.scaled(m_original.width()*m_scale, m_original.height()*m_scale, Qt::KeepAspectRatio));
// 放大
m_scale *= 1.5;
ui->board2->setPixmap(m_original.scaled(m_original.width()*m_scale, m_original.height()*m_scale, Qt::KeepAspectRatio));