Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android位图像素-直接写入文件?_Android_Image_Opengl Es_Bitmap_Memory Optimization - Fatal编程技术网

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

Android位图像素-直接写入文件?,android,image,opengl-es,bitmap,memory-optimization,Android,Image,Opengl Es,Bitmap,Memory Optimization,背景: 目标是使用OpenGL渲染数据编写一个相当大(至少2048 x 2048像素)的图像文件 今天,我首先使用glReadPixels将32位(argb8888)像素数据放入int数组 然后我将数据复制到一个新的短数组中,将32位argb值转换为16位(rgb565)值。在这一点上,我还将图像颠倒过来并更改颜色顺序,以使opengl图像数据与android位图数据兼容(不同的行顺序和颜色通道顺序) 最后,我创建了一个Bitmap()实例和.copyPixelsFromBuffer(缓冲区b)

背景:

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

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

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

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

然而,我想更有效地使用内存,以避免在某些手机上出现内存不足的崩溃


问题:

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

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


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

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

    对于写得很好的问题+1这确实减少了内存使用。使用PNGJ,我可以同时读取每个像素行(是的,我可以读取底部->顶部),并将其直接写入sd卡。我只需要分配一个(宽度x 3)字节数组,并对每一行重复使用它。与我以前做的相比,这几乎算不上什么!:)