2009-07-17 75 views
3

我有以下代碼。將QPixmap保存爲JPEG失敗(Qt 4.5)

QString fileName = QFileDialog::getSaveFileName(
    this, 
    tr("Output Image file"), 
    (""), 
    tr("PNG (*.png);;JPEG (*.JPEG);;Windows Bitmap (*.bmp);;All Files (*.*)") 
); 

if(fileName != "") 
{ 
    QwtPlot* pPlot = ... 
    QSize size = pPlot->size(); 
    QRect printingRect(QPoint(0, 0), size); 

    QPixmap pixmapPrinter(size); 
    pixmapPrinter.fill(Qt::white); 

    { 
     QPainter painter(&pixmapPrinter); 
     pPlot->print(&painter, printingRect);  
    } 

    bool isOk = pixmapPrinter.save(fileName); 

    if(!isOk) 
    {     
     QString msgText = tr("Failed to write into ") + fileName; 

     QMessageBox::critical(this, tr("Error Writing"), msgText); 
    } 
} 

因此,路徑是這樣的: - 文件對話框彈出 - 用戶選擇格式和文件 - 系統繪製情節上的QPixmap - 保存的QPixmap到文件中。

它適用於PNG和BMP沒有問題,但對於JPEG,JPG,JPG等失敗。

我當時都在Qt文檔中,但找不到任何細節。它應該只是工作。 任何想法?

我使用Qt商業版4.5.1 for Windows。
我正在使用DLL,Qt不在路徑上。

我剛剛意識到我靜態鏈接到一個經典的第三方jpeg.lib(獨立JPEG組的JPEG軟件),這是由其他庫使用。

是否有可能因此而引起衝突或其他事情?

或者它只是簡單的插件沒有正確加載。

回答

5

也許它不能找到插件...

您可以添加到項目庫路徑,也可以簡單地把imageformats文件夾中的二進制附近。

imageformats文件夾中的插件..

(可能你不能顯示JPEG圖像太)

+0

我認爲最後我們設法將qt plugins目錄中的imageformats文件夾放到項目目錄中,然後在發佈軌跡中進行排序。 – 2010-01-22 18:25:17

4

如果你是一個靜態的構建,必須添加QTPLUGIN += qjpeg到您的.pro文件,從而使imageformats的靜態jpeg庫與您的應用程序鏈接。

+0

我沒有進行靜態構建(至少我認爲)。 我的應用程序在沒有QtCore4.dll和QtGui4.dll的情況下運行在與exe相同的目錄中。 雖然 c:\ Qt \ 4.5.1 \ lib \ QtGui4.lib c:\ Qt \ 4.5.1 \ lib \ QtCore4.lib 提供給鏈接器,但我知道提供一個「橋」這樣編譯器就知道這個東西會在dll中出現,或者什麼的。 我會嘗試將QTPLUGIN + = qjpeg添加到.pro文件, 以查看它是否稍後會有所不同。 – 2009-07-17 17:46:57

4

你的插件很可能缺失,最好的工作方式是隻列出工具包支持的圖像格式。

這個例子是從我插入圖片,但你應該能夠適應它爲你保存爲:

QString fileFormats = "("; 
/* Get all inputformats */ 
for (int i = 0; i < QImageReader::supportedImageFormats().count(); i++) { 
    fileFormats += "*."; /* Insert wildcard */ 
    fileFormats 
      += QString(QImageReader::supportedImageFormats().at(i)).toLower(); /* Insert the format */ 
    fileFormats += " "; /* Insert a space */ 
} 
fileFormats += ")"; 

QString fileName = QFileDialog::getOpenFileName(this, tr("Open Image"), 
     currentPath, tr("Images ") + fileFormats); 

此外,我們有時會失去格式,如果開發者複製調試建立一個QA機。 Debug版本將尋找調試插件並且無法加載它們。