我正在使用PIL(Python成像库)将数百个512x512图像拼接在一起。生成的图像大约为300 MB。它适用于大约50 - 150 MB的结果,但在一些未知的边界之后,它们开始成为巨大的静力学。它们看起来像下图。
我已经尝试确保内存中的内存超过300 MB。我现在有大约4 GB免费,它仍然有这个问题。我认为这是PIL的一个问题。我猜它不应该处理大文件。
请帮忙。
编辑:img.show()实际显示图片(在预览中,因为我有一台Mac)。它显示时会被压缩,但我认为,因为我可以通过比较较小的文件看到压缩,它说它是一个.jpeg
答案 0 :(得分:1)
很可能你的实际问题不在于PIL,而在于你用来显示图像的任何东西。
你的问题也可能是PIL问题,它已被Pillow 2.0修复,或者它只发生在32位或其他什么,但我无法重现它。
无论如何,这是我生成一个2Mx60 PNG文件的代码,该文件在512x60 PNG的一堆副本中没有压缩超过300MB(但压缩不到1MB):
>>> src = PIL.Image.open('strip-512x60.png')
>>> dst = PIL.Image.new('RGBA', (4096*512, 60))
>>> for i in range(4096):
... dst.paste(src, (4096*i, 0))
>>> dst.save('strip-3Mx60.png')
我检查了文件;它有一个有效的PNG块结构和IHDR中的所有正确信息。
我可以在PIL中重新打开它,像素显然是有效的:
>>> dst = PIL.Image.open('strip-3Mx60.png')
>>> src.getpixel((0, 30))
(115, 67, 19)
>>> dst.getpixel((0, 30))
(115, 67, 19)
>>> dst.getpixel((4000*512, 30))
(115, 67, 19)
ImageMagick的命令行工具也可以很好地读取文件;将倒数第二个512x512裁剪成一个新文件并打开它给了我原始图像(或者至少足够接近通过快速视觉检查的东西)。
然而,几乎任何其他程序或高级库我尝试打开它都会失败,或者给我垃圾:
据推测,Apple的库(WebKit除外)和Gecko正在进行某种形式的检查,并决定声称宽度为2M像素的任何IHDR都是无效的,而其他一切都试图解释图像然后溢出一些内部在中止之前缓冲,或者不注意并且只是返回垃圾。
答案 1 :(得分:0)
在Windows上运行相同的代码。有效。当Mac上的Python保存时,实际图像已损坏,我很确定。
我在两者 Windows和Mac
上运行带有PIL 1.1.7的Python 2.5