2017-08-13 53 views
-1

我有一個包含RLE壓縮的8位RGB TGA圖像數據的緩衝區。我想這個加載到一個Magick ++圖像,但我不斷收到Magick ++ not loading TGA blob

Magick: no decode delegate for this image format `' @ error/blob.c/BlobToImage/353 

這裏是我的代碼

#include <Magick++.h> 
#include <fstream> 

int main(int argc, char** argv) 
{ 
    std::ifstream file("window_borders.tga", std::ios::binary | std::ios::ate); 
    std::streamsize size = file.tellg(); 
    file.seekg(0, std::ios::beg); 

    char* buffer = new char[size]; 
    if (!file.read(buffer, size)) return 1; 

    Magick::Blob data_blob(buffer, size); 
    Magick::Image m_image(data_blob); 

    return 0; 
} 

如果我確定我得到它

window_borders.tga TGA 330x390 330x390+0+0 8-bit sRGB 33106B 0.000u 0:00.000 

煩人,如果我指定這信息,那麼它工作得很好。我甚至可以把它轉換:

Magick::Image m_image(data_blob, Magick::Geometry("330x390"), "TGA"); 

m_image.magick("JPEG"); 
m_image.write("test.jpg"); 

事實上test.jpgwindow_borders.tga看起來相同。爲什麼不能自動檢測格式?

+0

除非我們用調試器跟蹤代碼,並明白爲什麼image_blob格式錯誤,否則很難分辨出來。 – AlexanderVX

+0

看到我上面的編輯。我有三重檢查,我正在提供正確的數據到blob構造函數,不知何故blob的有效性會根據其他未知因素而變化。 – Max

+0

現在'Magick :: Image m_image();'缺少'data_blob'參數? – AlexanderVX

回答

2

爲什麼不能自動檢測格式?

的TGA格式從來沒有真正有一個獨特的「magick數」頭,或其他一些 快速+可靠的方法來確定是否一個TGA一個blob中存在。

如果我沒有記錯的話,TGA的後續擴展版本引入字符串 TRUEVISION-XFILE作爲magick標識符,但在文件頁腳表中。

我不是專家,但我想象一些軟件設計師會搖晃他們的 頭。

現在,不僅是你負責的時間提前知道文件格式 (由給定文件名),但要充分&正確讀取圖像頭 確定圖像數據結束的地方,和圖像頁腳開始。

我猜想,這將是到爲什麼沒有 IsTGA方法就像我們IsPNGIsTIFF等大促成因素......

您先前發現的一個解決方案。

Magick::Image m_image(data_blob, Magick::Geometry("330x390"), "TGA"); 
// This should work too. 
Magick::Image m_image(data_blob, Magick::Geometry("0x0"), "TGA"); 

但你也可以做到以下幾點。

Magick::image m_image; 
m_image.magick("TGA"); 
m_image.read(data_blob);