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

6

背景:

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

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

然后,我将数据复制到一个新的short数组中,将32位argb值转换为16位(rgb565)值。此时,我还将图像上下翻转并更改颜色顺序,使opengl-image数据与android位图数据兼容(不同的行顺序和颜色通道顺序)。

最后,我创建一个Bitmap()实例,并使用.copyPixelsFromBuffer(Buffer b)方法,以便将其保存为png文件。

但是,我希望在内存使用效率方面更加高效,以避免在某些手机上发生内存不足的情况。


问题:

  1. 是否有办法跳过从int[] -> short[]的第一次转换(并避免为像素数据分配新数组)?也许只需使用byte数组/缓冲区,并将转换后的像素写入从中读取的相同数组...

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

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


如果问题表达得非常好,给我点赞吧。 - Ridcully
1个回答

3

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


这真的减少了内存使用。使用PNGJ,我能够一次读取每个像素行(是的,我可以从底部向上读取),并将其直接写入SD卡。我只需要分配一个(宽度x3)字节数组,并将其重复使用于每一行。与我以前所做的相比,这几乎不值一提! :) - cmbellman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接