0

我有一个 android 应用程序,我在其中加载资源图像文件并为它们创建纹理,以便我可以使用 OpenGL 渲染它们。但是,我使用的是 mipmap,并且图像尺寸必须是 2 的幂。这就是为什么我可能需要在制作纹理之前增加给定位图的宽度或高度。

这是我目前完成工作的代码:

    Bitmap bitmap = BitmapFactory.decodeResource(this.context.getResources(), resourceId);

    Bitmap newBitmap = Bitmap.createBitmap(nextPowerOfTwo(bitmap.getWidth()), 
            nextPowerOfTwo(bitmap.getHeight()), bitmap.getConfig());

    int x=0,y=0,width=bitmap.getWidth(),height=bitmap.getHeight();
    int [] pixels = new int[width * height];
    bitmap.getPixels(pixels, 0, width, x, y, width, height);
    newBitmap.setPixels(pixels, 0, width, x, y, width, height);
    bitmap.recycle();
    gl.glGenTextures(1, textures, textureCount);
            ...

这在我的 Asus TF101 和 Nexus 4 上运行良好,但我在以下行中得到了 Galaxy S3(可能还有更多设备)的 OutOfMemory 异常:

int [] pixels = new int[width * height];

通过阅读,我意识到对 Bitmap.createBitmap 的调用也很昂贵,我正在尝试想办法减少内存浪费。想到的第一个想法是使用较小的 2D 数组作为“int[] 像素”并一次复制更少的像素。但我想知道是否还有其他更有效的方法可以做到这一点。

4

1 回答 1

1

因为你只是创建一个缩放位图,这个方法应该是你的问题的解决方案: http://developer.android.com/reference/android/graphics/Bitmap.html#createScaledBitmap(android.graphics.Bitmap , int, int , 布尔值)

Bitmap newBitmap = Bitmap.createScaledBitmap(bitmap, nextPowerOfTwo(bitmap.getWidth()), nextPowerOfTwo(bitmap.getHeight()), false);
bitmap.recycle();
于 2013-08-18T17:55:41.820 回答