2010-09-14 118 views
1

我希望能夠將圖像保存爲xml文件中的文本,但我無法找到一種有效的方法來完成它!將圖像轉換爲文本

到目前爲止,我嘗試:

QByteArray ImageAsByteArray; 
QBuffer ImageBuffer(&ImageAsByteArray); 
ImageBuffer.open(QIODevice::WriteOnly); 
rImage.save(&ImageBuffer, "PNG"); 

return QString(ImageAsByteArray.toBase64()); 

儘管它的工作的事實,結果是一個文件,它是巨大的!我試圖在那裏添加一些QCompress,但沒有取得太大的成功......其實QCompress似乎並沒有壓縮任何東西......

我認爲我做錯了方式,但是有人可以照亮我的路嗎?

+0

你怎麼知道qCompress不壓縮任何東西?你正在檢查生成的文字大小或圖像的二進制大小?此外,你需要PNG圖像,還是可以使用高壓縮比的JPEG? – 2010-09-14 12:09:24

+0

嗨Jérôme:)嗯,我實際上在ImageAsByteArray上調用了QCompress,因此創建了另一個bytearray,兩個變量之間的大小差別非常小...實際上,我需要jpg和png ...這段代碼只是爲測試目的! – 2010-09-14 13:01:54

+0

什麼是「巨大」?每像素100x100像素x3字節原始數據已經是30kB,如果您使用PNG或JPEG壓縮了一點,您可以將其降低到5kB或10kB(取決於圖像當然),並且如果您使用base64編碼變成8kB-15kB。所以是的,這是一個只有100x100像素的長字符串,但確實值得期待。 – Ivo 2010-09-14 13:05:51

回答

6

您是否正在將圖像文件加載到QImage,然後從該QImage獲取字節?如果是,那麼你是base64編碼的原始圖像。在這種情況下,原始圖像文件的壓縮程度實際上並不重要。

您應該將原始圖像文件(png或jpg)作爲二進制流讀取,並使用base64對該流進行編碼。例如:

QFile* file = new QFile("Image001.jpg"); 
file->open(QIODevice::ReadOnly); 
QByteArray image = file->readAll(); 
int originalSize = image.length(); 

QString encoded = QString(image.toBase64()); 
int encodedSize = encoded.size(); 

我的測試圖像的originalSize爲1028558個字節,encodedSize爲1371412個字節,這是比originalSize 33%(見傑羅姆對你的問題的評論)。

+0

它以這種方式工作,但在某些時候,我需要一個QPixmap來顯示這個圖像...並且當我在使用它之後保存它時,它的大小增加了10倍......這很煩人,因爲某些原因例如調整大小的目的)我想要一個QImage或一個QPixmap,但每當圖像的大小一旦成爲其中一個對象時,圖像的大小就會大大增加......任何想法? – 2010-10-08 19:58:52

+0

如果您有QPixmap,請先將其首先保存到QByteArray(請參閱http://doc.qt.nokia.com/4.7/qpixmap.html#save-2),例如JPG格式。現在您可以將該字節數組(包含壓縮格式的圖像數據)保存到磁盤。 – 2010-10-08 20:21:00

+0

這就是我所做的,但如果我需要調整圖像大小,我必須首先將其設置爲QPixmal(或QImage),調整大小,然後將其作爲QByteArray獲取,但重量要大得多!只要我將圖像傳遞給QPixmap,我無法將它重新帶回QByteArray,並且重量正確... – 2010-10-08 21:37:08