简短版本:iOS' UIImageJPEGRepresentation()
在大图片上崩溃。我试图使用&修改libjpeg以尊重它忽略的max_memory_to_use
字段。
长版本:我正在编写一个iOS应用程序,在长时间使用后将大图像转换为JPEG时崩溃会减少可用内存(涉及@autoreleasepool{}
怪癖的漏洞泄漏,但我们正在解决那个单独)。对于设备摄像头捕获的图像(正常使用,实际尺寸)UIImageJPEGRepresentation()
最多可能需要200MB(!),如果不可用则会崩溃。这是UIImageJPEGRepresentation()
的问题,网络搜索显示多年来一直存在并且似乎未解决;向Apple elicits提交技术支持请求"提交错误报告"这并不能解决我的直接客户需求。
为了解决这个问题,我通过使用libjpeg(http://www.ijg.org)绕过UIImageJPEGRepresentation()
并深入研究其操作,这显示了完全相同的问题(可能是Apple在iOS中使用它)。 libjpeg确实提供了一种通过参数max_memory_to_use
a la:
struct jpeg_compress_struct cinco;
cinfo.mem->max_memory_to_use = 10*1024*1024;
将由libjpeg函数jpeg_mem_available (j_common_ptr cinfo, long min_bytes_needed, long max_bytes_needed, long already_allocated)
(在jmemnobs.c中)使用,但在标准实现中,完全被忽略(注释甚至说Here we always say, "we got all you want bud!"
)。 Blender改变了函数(http://download.blender.org/source/chest/blender_2.03_tree/jpeg/jmemmac.c)以尊重参数,但似乎我错过了一些让它在我的应用程序中运行的东西,或者它在其他地方被忽略了。
那么:如何将libjpeg中的jmemnobs.c修改为实际&认真尊重记忆限制,而不是开玩笑地忽略它们?