Android 位图像素 - 直接写入文件?

标签 android image opengl-es bitmap memory-optimization

背景:

目标是使用 OpenGL 渲染数据编写一个相当大(至少 2048 x 2048 像素)的图像文件。

今天我首先使用 glReadPixels 将 32 位 (argb8888) 像素数据放入一个 int 数组中。

然后我将数据复制到一个新的短数组中,将 32 位 argb 值转换为 16 位 (rgb565) 值。在这一点上,我还颠倒了图像并更改了颜色顺序,以使 opengl-image 数据与 android 位图数据兼容(不同的行顺序和颜色 channel 顺序)。

最后我创建了一个 Bitmap() 实例和 .copyPixelsFromBuffer(Buffer b) 以便能够将其作为 png 文件保存到磁盘。

但是我想更有效地使用内存,以避免某些手机出现内存不足的崩溃。


问题:

  1. 我能否以某种方式跳过从 int[] -> short[] 的第一个转换(并避免为像素数据分配新数组)?也许只是使用字节数组/缓冲区并将转换后的像素写入我从中读取的相同数组......

  2. 更重要的是:我可以跳过位图创建(这里是程序崩溃的地方)并以某种方式将数据作为工作图像文件直接写入磁盘(并避免在位图对象中再次分配像素数据)吗?

编辑:如果我可以将数据直接写入文件,也许我不需要转换为 16 位像素数据,这取决于文件大小以及稍后将文件读入内存的速度。

最佳答案

我不确定这是否有帮助,但是,这个 PNGJ库允许逐行顺序写入 PNG。如果内存使用是您的主要关注点(并且如果您可以从渲染数据中按照最终 PNG 文件的顺序访问像素值),它可能会有用。

关于Android 位图像素 - 直接写入文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12226201/

相关文章:

android - 如何在不丢失现有数据的情况下升级Android应用程序第一版自己的SQLite数据库

android - 使用 android drawable layer ist 创建比其 View 更短的边框

java - 如果连接到互联网/wifi,Android 运行代码

安卓媒体扫描仪 : Remove image file(s) from gallery

javascript - 图像损坏,但它作为新选项卡加载

html - 可以将着色器应用于 DOM 元素吗?

java - 添加监听器 vs 设置监听器

php - Src 图像和安全性

iphone - 尝试使用帧缓冲区渲染纹理总是会导致白色纹理

android - 适用于 Android OpenGL ES 的着色器