ImageMagick错误:无法打开图像

ImageMagick Error: Unable to open image

本文关键字:图像 错误 ImageMagick      更新时间:2023-10-16

我在我的应用程序中使用ImageMagick (magick++),但当试图加载图像时,我得到错误:

Unable to open image '??': Invalid argument @ error/blob.c/OpenBlob/2657

从在线阅读其他人的问题??通常是试图加载的文件,我显然没有将文件位置??传递给加载器-所以它似乎无法解决我给它的字符串。尝试使用Unicode和多字节。从示例中复制了项目设置。

代码:

LawlessFBXTexture* LawlessFBXTextureManager::CreateTexture(std::string pFullFilePath) 
{
    Magick::Image* img = nullptr;
    Magick::Blob blob;
    try
    {
        img = new Magick::Image();
        img->read(pFullFilePath);
        img->write(&blob, "RGBA");
    }
    catch (Magick::Error& Err)
    {
        std::string errstr = Err.what();
        std::wstring stemps = std::wstring(errstr.begin(), errstr.end());
        LPCWSTR sws = stemps.c_str();
        OutputDebugString(L"FBXSDK: ERROR: ");
        OutputDebugString(sws);
        OutputDebugString(L"n");
        int ImageNotFound = 0;      /// Image Not found <---
        assert(ImageNotFound);
    }
    LawlessFBXTexture* tex = new LawlessFBXTexture();
    glGenTextures(1, &tex->TextureBuffer);
    glBindTexture(GL_TEXTURE_2D, tex->TextureBuffer);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, img->columns(), img->rows(), 0, GL_RGBA, GL_UNSIGNED_BYTE, blob.data());
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    return tex;
}

LawlessFBXTexture* tex = CreateTexture("..\..\Asset\Models\LawlessCoreAsset\DEFAULT_DIFFUSE.png");

我注意到这在发布模式下工作得很好,不需要做任何更改。我很确定这是一个bug,所以我会把我的发现张贴在Magick论坛上。

所以,在接受OP的建议并将我的项目设置为发布模式后,一切都很顺利。也就是说,我很快意识到Debug模式存在的一个很好的理由。为一个不给出运行时错误消息的程序编写代码绝对是一件痛苦的事情。更不用说所有您喜欢的便利,如断点、断言等都消失了。

结果是,尽管为每个平台提供了多个二进制发行版,但根本没有可用的开发人员二进制文件。我的意思是,如果你想在使用magick++库时调试你的程序,你必须从源代码编译你的dll(使用调试配置来编译那些dll)。只有这样,您才能对链接到它的项目使用Debug编译模式。

这是我发现的讨论这个问题的线程。注意,在线程中,它说要构建静态库,但这显然是不必要的,使用动态库选项可能更方便。

无论如何,如果您按照我提供的链接中列举的步骤进行调试,您应该最终能够调试magick++程序,而不必费力:)

由于某些原因,Visual Studio中的 magick++ 不喜欢/MTd选项

  Configuration Properties->C++->Code Generation->Runtime Library
    Setting