2009-06-03 264 views
0

我想分配内存 NSImage * originalLocationImage;我想为700 MB分配内存到800 MB图像大小

NSURL * fileURL = [NSURL fileURLWithPath:originalLocation]; // originalLocation是我磁盘中的文件路径

originalLocationImage = [[NSImage alloc] initByReferencingURL:fileURL];

NSBitmapImageRep *sourceRep = [[NSBitmapImageRep alloc]initWithData:[SourceImage TIFFRepresentation]] //this line fails to allocate memory 

,也未能为大尺寸图像/

,并引发错误

malloc: *** mmap(size=268435456) failed (error code=12) 
*** error: can't allocate region 
*** set a breakpoint in malloc_error_break to debug 

的小图像能够正常工作。

任何帮助?

回答

1

我会问你为什么要把所有的图像加载到内存中 - 当然,像瓷砖一样处理它会是更好的选择吗?

您收到此消息是因为,虽然你可能有这么多的空闲内存,你没有自由

+0

之后,我想创建该图像的预览,那么最好的方法是做什么。我尝试了很多东西,但现在找不到任何方法。 – ashish 2009-06-03 09:27:34

1

这么多连续内存如果你想要的是一个预览,您可以通过在线阅读行,每隔n行跳过一行,跳过每n个像素。如果需要,您可以通过较小的图像(较小的图像)通过更复杂的缩放算法,也可以将其保存为缩略图图像或任何其他图像。

+0

您提出的解决方案听起来不错,但由于格式可能被压缩,所以他不能二进制跳过输入 - 他必须解压缩,然后从解压缩的输出中跳过数据。 – diciu 2009-06-03 10:18:36

+0

是的,但你可以解压缩块,你不必阅读整个图像来做到这一点。 – Blindy 2009-06-03 10:47:51

2

使用libjpeg可能是一个选项,它似乎能够做一个优化的子缩放到16:http://jpegclub.org/djpeg/

libjpeg是纯C语言,所以你可以从Objective-C调用它。

+0

IHAVE问题这行代码,太多与TIFF图像 我试图图像1 GB大小PSD工作正常 NSBitmapImageRep * sourceRep = [[NSBitmapImageRep的alloc] initWithData:[SourceImage TIFFRepresentation]] //这行无法分配存储器 有关如何在这种情况下分配内存的任何建议。 – ashish 2009-06-03 10:07:05

0

如果您只想创建图像的预览,CGImageSource具有特定的API。他们是第一个,不需要将整个图像读入内存。

相关问题