Magick ++没有加载TGA blob

时间:2017-08-13 20:31:47

标签: c++ imagemagick

我有一个包含RLE压缩的8位RGB TGA图像数据的缓冲区。我想将它加载到Magick ++图像中,但我一直在

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看起来完全相同。为什么不能自动检测格式?

1 个答案:

答案 0 :(得分:2)

  

为什么无法自动检测格式?

TGA格式从未真正拥有一个独特的&#34; magick-number&#34;标题,或其他一些 快速+可靠的方法来识别blob中是否存在TGA。

如果我没记错的话,后来扩展版的TGA引入了字符串 TRUEVISION-XFILE作为magick标识符,但在文件页脚表中。

我不是专家,但我想有些软件设计师会动摇他们的 头。

现在,您不仅要负责提前了解文件格式 (通过给定的文件名),但必须完全&amp;正确读取图像标题 确定图像数据停止的位置,图像页脚开始。

我猜这将是一个很大的因素,为什么没有 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);