gpt4 book ai didi

android - 在 Android 上处理大位图 - int[] 大于最大堆大小

转载 作者:搜寻专家 更新时间:2023-11-01 09:11:26 25 4
gpt4 key购买 nike

我正在使用非常大的位图并将数据存储在一个大的 int[] 中。图像可能非常大,我无法对它们进行缩减采样(我通过网络获取位图并渲染它们)。

我遇到的问题是在非常大的位图(位图大小 = 64MB)上,我尝试分配大小为 16384000 的 int 数组。我正在三星 Galaxy SII 上测试它,它应该有足够的内存来处理这个问题,但堆大小似乎有一个“上限”。 Runtime.getRuntime().maxMemory() 方法返回 64MB,因此这是该特定设备的最大堆大小。

API 级别设置为 10,所以我不能使用其他地方建议的 android:largeHeap 属性(我什至不知道这是否有帮助)。

有什么方法可以分配超过64MB吗?我尝试在 native 中分配数组(使用 JNI NewIntArray 函数),但这也失败了。似乎它受到与 jvm 相同的限制。

不过,我可以使用 NewDirectByteBuffer 在 native 端分配内存,但是由于这个字节缓冲区没有数组支持,所以我无法访问 int[] (在我需要的 Java 中使用 asIntBuffer().array() 以便使用 setPixelscreateBitmap 显示图像。我猜 OpenGL 会是一条路要走,但我(到目前为止)有 0 个 OpenGL 经验。

有没有办法以某种方式访问​​分配的内存作为我缺少的 int[]?

最佳答案

所以,到目前为止我发现的唯一方法是使用 NDK 分配图像。此外,由于 Bitmap 不使用现有 Buffer 作为像素“存储”(方法 copyPixelsFromBuffer 也受内存限制;从方法名称判断,它复制数据无论如何)。

解决方案(我只是粗略地制作了它的原型(prototype))是 malloc 无论图像的大小是多少,然后使用 c/c++ 填充它,然后在 Java 中使用 ByteBuffer 和 OpenGLES .

当前的原型(prototype)创建了一个简单的平面并将该图像作为纹理应用于它(幸运的是,OpenGLES 方法将 Buffer 作为输入,这似乎按预期工作)。我正在使用 glTexImage2D 将此缓冲区作为纹理应用于平面。这是一个示例,其中 mImageData 是在 native 端分配(并填充)的 ByteBuffer。

int[] textures = new int[1];
gl.glGenTextures(1, textures, 0);
mTextureId = textures[0];
gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextureId);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_REPEAT);
gl.glTexImage2D(GL10.GL_TEXTURE_2D, 0, GL10.GL_RGBA, 4000, 4096, 0, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, mImageData);

关于android - 在 Android 上处理大位图 - int[] 大于最大堆大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8037821/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com