2013-12-10 93 views
0

我有一個圖像,我試圖使用QImage ::轉換(const QTransform &矩陣,Qt :: TransformationMode模式)const方法來轉換選定的圖像部分。 但是這個方法返回null圖像。另外Qt寫到std輸出:「Qimage:內存不足,返回空映像。」QImage transfrom返回null

QImage img; 
    img.load("D:\\3.png"); 

QPolygonF polygonIn; 
polygonIn << QPointF(73, 63) 
    << QPointF(362, 22) 
    << QPointF(517, 325) 
    << QPointF(1, 210); 

QPolygonF polygonOut; 
polygonOut << QPointF(45, 39) 
    << QPointF(228, 13) 
    << QPointF(228, 198) 
    << QPointF(180, 198); 

    QTransform transform; 
auto isOk = QTransform::quadToQuad(polygonIn, polygonOut, transform); 
if(!isOk) 
    throw std::runtime_error("Transformation impossible with such parameters."); 

auto result = img.transformed(transform, Qt::TransformationMode::SmoothTransformation); 

我試過調試QImage源代碼。 On line 6633 of qimage.cpp

QImage dImage(wd, hd, target_format); 
QIMAGE_SANITYCHECK_MEMORY(dImage); 

wd和hd值很大。

也許有人知道我該如何解決這個問題。順便說一句,我使用qt 4.8.4。 感謝您的幫助。

+0

什麼是圖像的寬度和高度?據我所知,如果它們大於〜32000像素,則可能是加載這樣的圖像的問題。 – vahancho

+0

我的輸入圖像是s29.postimg.org/k45fwbmsn/Untitled.png,我想將它轉換成黃色多邊形s9.postimg.org/3rcfnjej3/Untitled_Transform.png這一點實際上是角落的座標。 – yaroslav

+0

你的多邊形肯定是不正確的,併產生具有比例因子〜1e + 6的異常變換。這就是爲什麼你得到空圖像。 – vahancho

回答

0

QImage工作正常。問題在於你的轉變。試試下面的代碼來檢查:

qDebug() << transform.map(QRectF(0, 0, img.width(), img.height())).boundingRect(); 

它返回QRectF(-2.21401e+08,-1.9792e+08 2.21401e+08x1.97921e+08),如果圖像是100×100。很顯然,大的內存不適合的圖像。您需要更正變形,以便將圖像縮放到合理的大小。我不知道你從哪裏得到這些神奇的數字,但嘗試獲得新的數字。

另外img = img.scaled(img.width(), img.height());顯然沒有效果(將圖像縮放到它已有的大小有什麼意義?)。與painter相關的代碼似乎不完整,但這可能是一個複製粘貼問題。

+0

感謝您的回答。我的輸入圖像是http://s29.postimg.org/k45fwbmsn/Untitled.png,我想將其轉換爲黃色多邊形http://s9.postimg.org/3rcfnjej3/Untitled_Transform.png這一點實際上是角落涼鞋。是否存在一些解決方法來減少轉換後的圖像大小? – yaroslav

+0

轉換變得非常糟糕 - 請參閱此圖像:http://i.stack.imgur.com/ipLM7.png(通過手動圖像轉換生成)。看起來這些多邊形的變換太過曲線。你唯一能做的就是選擇不同的多邊形。 –