2017-08-13 64 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);