在OpenGL ES for Android上加载纹理的特定位图时出错

时间:2011-11-29 11:01:09

标签: android opengl-es

我正在开发一个视频游戏,我正在手机上测试它。最近,我决定在另一台设备上测试它,在这个新设备中,我遇到了一些特定纹理的问题,而其余设备都很好。我不知道会发生什么,我已经尝试了很多东西,似乎什么都没有用。 如果我改变其他类似的bmp图片,它会很好地加载,但是当我移回原版时它根本不会加载。

我使用的加载纹理的代码如下:(虽然我认为这很常见,但不应该崩溃......)

InputStream is = context.getResources().openRawResource(R.drawable.skybox_frente);
Bitmap bitmap = null;
try {
    bitmap = BitmapFactory.decodeStream(is);
} finally {
    try {
        is.close();
        is = null;
    } catch (IOException e) {
    }
}
    gl.glGenTextures(1, textures, 0);

gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);
if(gl instanceof GL11) {
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR_MIPMAP_NEAREST);
    gl.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_GENERATE_MIPMAP, GL11.GL_TRUE);
} else {
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR);
}
gl.glTexEnvx(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_MODULATE);
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);

bitmap.recycle();

确切的错误是BitmapFactory.decodeStream返回null,即使InputStream为非null。

编辑:事实上,错误是在获取InputStream时,context.getResources().openRawResource(R.drawable.skybox_frente)正在返回一个只有特定图片的空流...

这是我无法加载的图片之一:

http://www.mediafire.com/?1if0iazmc89file

谢谢大家的时间!

1 个答案:

答案 0 :(得分:0)

尝试将图像数据加载到字节数组中,并使用BitmapFactory类的decodeByteArray。

将图像数据加载到字节数组中 -

         BufferedInputStream bis = new BufferedInputStream(is);
         ByteArrayBuffer baf = new ByteArrayBuffer(bis.count);
         int current = 0;
         while ((current = bis.read()) != -1) {
                baf.append((byte)current);
          }
         byte[] imageData = baf.toByteArray();

然后使用“imageData”使用BitmapFactory的decodeByteArray。

         BitmapFactory.decodeByteArray(imageData, 0, imageData.length)

如果这对你有用,请告诉我。