无法加载简单图像。 Libgdx
Can`t load an simple image. Libgdx
我正在使用 LibGDX 制作启动画面(为我的游戏)。
我使用的是 .png 格式的图像,其中很少 - 它有效(我的图像正确位于资产文件夹中)
我想使用的一些图像出现此错误:
Exception in thread "LWJGL Application" com.badlogic.gdx.utils.GdxRuntimeException: Couldn't load file: devlogo.png
at com.badlogic.gdx.graphics.Pixmap.<init>(Pixmap.java:140)
at com.badlogic.gdx.graphics.TextureData$Factory.loadFromFile(TextureData.java:98)
at com.badlogic.gdx.graphics.GLTexture.createTextureData(GLTexture.java:185)
at com.badlogic.gdx.graphics.Texture.<init>(Texture.java:103)
at com.badlogic.gdx.graphics.Texture.<init>(Texture.java:95)
at com.badlogic.gdx.graphics.Texture.<init>(Texture.java:91)
at com.GunRun.Screens.Splash.show(Splash.java:34)
at com.badlogic.gdx.Game.setScreen(Game.java:61)
at com.mynewgame.game.GunRun.create(GunRun.java:16)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:143)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication.run(LwjglApplication.java:120)
Caused by: java.io.IOException: Error loading pixmap: decoder init failed for stream
at com.badlogic.gdx.graphics.g2d.Gdx2DPixmap.<init>(Gdx2DPixmap.java:57)
at com.badlogic.gdx.graphics.Pixmap.<init>(Pixmap.java:138)
... 10 more
启动画面中的代码class:
public class Splash implements Screen{
private Sprite devlogo;
private SpriteBatch batch;
@Override
public void render(float delta) {
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
devlogo.draw(batch);
batch.end();
}
@Override
public void resize(int width, int height) {
}
@Override
public void show() {
batch = new SpriteBatch();
Texture texture = new Texture("devlogo.png");
devlogo = new Sprite(texture);
devlogo.setSize(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
}
@Override
public void pause() {
}
@Override
public void resume() {
}
@Override
public void hide() {
}
@Override
public void dispose() {
}
}
作品用的图片有24位深度,其他没有64位深度的,会不会有问题?
简单,使用任何照片编辑器更改 RGB 配置文件(我使用的是 photoshop)。
当你去保存图片的时候,把之前的RGB配置文件排除掉即可。
我最近也遇到了这个问题,所以我深入研究了该错误消息的来源。错误来自 jpgd.cpp 中的 this line:
jpeg_decoder decoder(pStream);
if (decoder.get_error_code() != JPGD_SUCCESS) {
err_reason = "decoder init failed for stream";
return NULL;
}
有趣的是,由于这些是 PNG,因此很怀疑它正在尝试将图像加载为 JPG。事实证明,如果 LibGDX 在第一次尝试时未能将图像加载到内存中,将会发生 here:
const unsigned char* pixels = stbi_load_from_memory(buffer, len, &width, &height, &format, 0);
if (pixels == NULL) {
pixels = jpgd_decompress_jpeg_image_from_memory(buffer, len, &width, &height, &format, 3);
}
事实证明,我遇到这个问题是因为我的部分游戏存在大量内存泄漏,所以 LibGDX 只是无法分配内存来加载图像。修复内存泄漏为我解决了问题。
由于这发生在您的初始屏幕上,我猜内存泄漏不是您问题的原因,但可能值得检查您是否为应用程序分配了足够的内存。
在我的例子中,我必须以 8 位/通道而不是 16 位/通道保存图像。
我正在使用 LibGDX 制作启动画面(为我的游戏)。 我使用的是 .png 格式的图像,其中很少 - 它有效(我的图像正确位于资产文件夹中) 我想使用的一些图像出现此错误:
Exception in thread "LWJGL Application" com.badlogic.gdx.utils.GdxRuntimeException: Couldn't load file: devlogo.png
at com.badlogic.gdx.graphics.Pixmap.<init>(Pixmap.java:140)
at com.badlogic.gdx.graphics.TextureData$Factory.loadFromFile(TextureData.java:98)
at com.badlogic.gdx.graphics.GLTexture.createTextureData(GLTexture.java:185)
at com.badlogic.gdx.graphics.Texture.<init>(Texture.java:103)
at com.badlogic.gdx.graphics.Texture.<init>(Texture.java:95)
at com.badlogic.gdx.graphics.Texture.<init>(Texture.java:91)
at com.GunRun.Screens.Splash.show(Splash.java:34)
at com.badlogic.gdx.Game.setScreen(Game.java:61)
at com.mynewgame.game.GunRun.create(GunRun.java:16)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:143)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication.run(LwjglApplication.java:120)
Caused by: java.io.IOException: Error loading pixmap: decoder init failed for stream
at com.badlogic.gdx.graphics.g2d.Gdx2DPixmap.<init>(Gdx2DPixmap.java:57)
at com.badlogic.gdx.graphics.Pixmap.<init>(Pixmap.java:138)
... 10 more
启动画面中的代码class:
public class Splash implements Screen{
private Sprite devlogo;
private SpriteBatch batch;
@Override
public void render(float delta) {
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
devlogo.draw(batch);
batch.end();
}
@Override
public void resize(int width, int height) {
}
@Override
public void show() {
batch = new SpriteBatch();
Texture texture = new Texture("devlogo.png");
devlogo = new Sprite(texture);
devlogo.setSize(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
}
@Override
public void pause() {
}
@Override
public void resume() {
}
@Override
public void hide() {
}
@Override
public void dispose() {
}
}
作品用的图片有24位深度,其他没有64位深度的,会不会有问题?
简单,使用任何照片编辑器更改 RGB 配置文件(我使用的是 photoshop)。
当你去保存图片的时候,把之前的RGB配置文件排除掉即可。
我最近也遇到了这个问题,所以我深入研究了该错误消息的来源。错误来自 jpgd.cpp 中的 this line:
jpeg_decoder decoder(pStream);
if (decoder.get_error_code() != JPGD_SUCCESS) {
err_reason = "decoder init failed for stream";
return NULL;
}
有趣的是,由于这些是 PNG,因此很怀疑它正在尝试将图像加载为 JPG。事实证明,如果 LibGDX 在第一次尝试时未能将图像加载到内存中,将会发生 here:
const unsigned char* pixels = stbi_load_from_memory(buffer, len, &width, &height, &format, 0);
if (pixels == NULL) {
pixels = jpgd_decompress_jpeg_image_from_memory(buffer, len, &width, &height, &format, 3);
}
事实证明,我遇到这个问题是因为我的部分游戏存在大量内存泄漏,所以 LibGDX 只是无法分配内存来加载图像。修复内存泄漏为我解决了问题。
由于这发生在您的初始屏幕上,我猜内存泄漏不是您问题的原因,但可能值得检查您是否为应用程序分配了足够的内存。
在我的例子中,我必须以 8 位/通道而不是 16 位/通道保存图像。