首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Qt QPixmap 縮放後放大反而變小:邏輯錯誤排查

     編輯:程式設計綜合問答

問題代碼

// 縮小
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 因整數除法截斷)。

正確做法

  1. 保存原始圖片:QPixmap original = ...; 所有縮放基於 original 計算目標尺寸。
  2. 使用縮放因子累乘:維護 qreal scaleFactor = 1.0;,縮小 scaleFactor /= 1.5,放大 scaleFactor *= 1.5,每次 original.scaled(original.width()*scaleFactor, ...)。
  3. 或用 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));
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved