【问题标题】:Android Bitmap Pixels - write directly to file?Android位图像素 - 直接写入文件?
【发布时间】:2012-08-26 21:53:53
【问题描述】:

背景:

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

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

然后我将数据复制到一个新的短数组中,将 32 位 argb 值转换为 16 位 (rgb565) 值。此时我也把图片倒过来,改变颜色顺序,使opengl-image数据兼容android位图数据(不同的行顺序和颜色通道顺序)。

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

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


问题:

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

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

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

【问题讨论】:

  • +1 写得非常好

标签: android image opengl-es bitmap memory-optimization


【解决方案1】:

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

【讨论】:

  • 这确实减少了内存使用。使用PNGJ,我可以同时读取每个像素行(是的,我可以读取底部-> 顶部),并将其直接写入SD卡。我只需要分配一个(宽度 x 3)字节数组并为每一行重用它。与我之前所做的相比,这几乎没有! :)
猜你喜欢
  • 2015-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多