我在我的应用程序中使用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");
答案 0 :(得分:3)
我注意到这在发布模式下工作正常,没有进行更改。我很确定这是一个错误,所以我会在Magick论坛上发布我的发现。
答案 1 :(得分:1)
因此,在听取了OP的建议并将我的项目设置为发布模式后,一切都运行良好。也就是说,我很快意识到调试模式存在的原因非常充分。为没有给出运行时错误消息的程序编写代码是***的绝对痛苦。更不用说断点,断言等所有你喜欢的便利了。
事实证明,尽管为每个平台提供了多个二进制发行版,但根本没有可用的开发人员二进制文件。我的意思是,如果你想在使用Magick ++库时能够调试你的程序,你必须从源代码编译你的DLL(使用调试配置来编译这些DLL)。只有这样,您才可以将Debug编译模式用于与之链接的项目。
我在the thread发现了这个问题。请注意,在线程中它表示构建静态库,但这显然不是必需的,并且使用动态库选项构建可能更方便。
无论如何,如果你按照我提供的链接中列举的步骤进行操作,你最终应该能够调试你的Magick ++程序,而不需要拔掉头发:)
答案 2 :(得分:0)
出于某种原因,Visual Studio上的 Magick ++ 不喜欢/ MTd选项
Configuration Properties->C++->Code Generation->Runtime Library
Setting
它/ MT应该可以正常工作。