【发布时间】:2015-05-01 08:13:30
【问题描述】:
我正在尝试将 png 或 bmp 加载到我的程序中。但是我在网上找到的库都没有。我不知道为什么,但是在使用 lodepng 时,每个 png 总是得到“不正确的 PNG 签名,它不是 PNG 或损坏”。使用 SDL_loadBMP 时每个 bmp 的“未知像素格式”。使用 stb_image 时每个 png 的“未知图像类型”。
我无法加载任何内容。也许我的系统有问题?我正在使用 OSX Yosemite。这是代码。
#include <iostream>
#include <string>
#define STB_IMAGE_IMPLEMENTATION
#include <lodepng.h>
#include <stb_image.h>
using namespace std;
int main (){
string name = "res/img_test.png";
const char * cstr = name.c_str();
//lodepng
unsigned char *buffer;
unsigned int w,h;
int result = lodepng_decode32_file(&buffer, &w, &h, cstr);
cout << lodepng_error_text(result) << endl;
//stb_image
int x, y, comp;
FILE *f = fopen(cstr, "rb");
unsigned char *res;
res = stbi_load_from_file(f,&x,&y,&comp,0);
fclose(f);
cout << stbi_failure_reason() << endl;
return 0;
}
我正在使用最新的 cmake 通过 gcc 构建它。任何建议表示赞赏,但请考虑这一点。我尝试了很多文件(由我生成或从互联网上获取)。与这些库的其他用户一起测试了相同的文件。他们的代码有效,而我的无效。
编辑:
这里是完整cmake项目的源代码>> github.com/onatbas/png_load_test.git
【问题讨论】:
-
除非您调用的函数实际失败,否则不要打印错误消息。例如,
lodepng_decode32_file或stbi_load_from_file返回什么?哦,我假设您要加载的文件是实际的 PNG 图像,可以从其他程序加载? -
它们确实返回错误值。例如 lodepng 返回 28 代表“损坏的 png 标头”。它正在检查 png 标头,我逐字节跟踪它。 1 1 1 1 0 0 0 1 。它看起来像这样。 5th 6th 7th 字节错误。但是对于每个png???? stb_image 也是一个错误值。您也可以说因为尺寸仍然是 0 0。并且缓冲区是空的,当将其加载到 opengl texture2d 时,什么都没有加载,一切都是黑色的。对于 bmps(我尝试使用 SDL2)我得到这个 >> SDL_error "SDL 错误:文件不是 Windows BMP 文件"
-
如果这些字节位于图像的开头,那么它绝对不是 PNG 图像,其标头应以 like this 开头。
-
不 这只是一个跟踪,如果字节是他们应该的。第 5、6 和 7 个字节不匹配。但就像我说的,对于每个 png。我也尝试了这些图像库的测试文件。我有一些朋友给我发了一些在他们的电脑上测试过的 png,但无法在我的电脑上加载。
-
您是否使用协议通过网络传输文件,例如行尾翻译?因为如果您查看我在之前的评论中链接到的标头,就会发现这些字节是用来检测这类问题的。你看过十六进制编辑器中的前八个字节吗?可以给我们看看吗?