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
Python PIL将大型图像保存为静态图像_Python_Image_Python Imaging Library_Save - Fatal编程技术网

Python PIL将大型图像保存为静态图像

Python PIL将大型图像保存为静态图像,python,image,python-imaging-library,save,Python,Image,Python Imaging Library,Save,我正在使用PIL(Python图像库)将数百个512x512图像缝合在一起。生成的图像约为300 MB。它非常适合50-150MB左右的结果,但在一些未知边界之后,它们开始变成巨大的静力学。它们如下图所示 我已尝试确保我的内存超过300 MB。我现在有大约4GB的空闲空间,但它仍然存在这个问题。我认为这是PIL的问题。我猜它不应该处理大文件 请帮忙 edit:img.show()实际显示图片(在预览中,因为我有一台Mac)。但是,我认为,当它被显示时,它是被压缩的,因为我可以通过比较较小的文件

我正在使用PIL(Python图像库)将数百个512x512图像缝合在一起。生成的图像约为300 MB。它非常适合50-150MB左右的结果,但在一些未知边界之后,它们开始变成巨大的静力学。它们如下图所示

我已尝试确保我的内存超过300 MB。我现在有大约4GB的空闲空间,但它仍然存在这个问题。我认为这是PIL的问题。我猜它不应该处理大文件

请帮忙


edit:img.show()实际显示图片(在预览中,因为我有一台Mac)。但是,我认为,当它被显示时,它是被压缩的,因为我可以通过比较较小的文件看到压缩,它说它是一个.jpeg

很可能你的实际问题不是PIL,而是你用来显示图像的任何东西

也有可能你的问题是PIL,它已经被枕头2.0修复了,或者它只发生在32位上,或者别的什么,但我无法复制它

不管怎样,下面是我生成2Mx60 PNG文件的代码,该文件的未压缩容量超过300MB(但压缩容量低于1MB),它来自512x60 PNG的一堆副本:

>>> 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剪切到一个新文件中并打开它,我得到了原始图像(或者至少是足够近的东西,可以通过快速目视检查)

但是,我尝试打开的几乎任何其他程序或高级库要么失败,要么给我垃圾:

  • QuickLook系统记录“ImageIO:PNG无效IHDR数据”,然后返回0x0图像
  • 一个普通的CoreImage测试程序syslog“ImageIO:PNG无效IHDR数据”然后返回一个纯黑色图像,我猜这是一个默认大小(大约600x600)
  • 预览提供了一个关于无效文件类型的错误
  • Firefox提供了一个关于无效图像内容的错误
  • Chrome和Safari会显示一个损坏的图像标签。这需要几分钟
  • LibreOffice Draw给了我一个类似600x64K的图像,由奇怪的红、白、黑色带组成。它甚至比WebKit需要更长的时间
  • 一个普通的.NET图像查看器(在Mono中运行)会抛出大量错误,然后显示传统的模拟电视风格的静态图像。这比LibreOffice花费的时间还要长

据推测,苹果的库(WebKit除外)和Gecko只是在进行某种健全性检查,并判定任何声称宽200万像素的IHDR都是无效的,而其他一切都在试图解释图像,然后在中止之前溢出一些内部缓冲区,或者没有注意到,只是返回垃圾。

只是在Windows上运行了相同的代码。成功了。我敢肯定,当Python在Mac上保存实际图像时,它已损坏


我在Windows和Mac上运行Python2.5和PIL 1.1.7,300MB是图像的未压缩大小,还是PNG或JPG的大小?(跨越2GB或4GB的错误比跨越300MB的错误更有意义……但也可能类似于跨越64Kpix宽度。)此外,您使用的是哪种版本的PIL(或枕头)?有可能您遇到了一个已经修复的bug…最后,您确定这些文件实际上是坏的,并且不仅仅是您用来查看它们的东西吗?因为我刚刚创建了一个尺寸为2Mx60的PNG(未压缩的300MB多一点,压缩的1MB以下),并在Mac上的各种程序中打开了它。预览和Firefox都会立即给我错误;QuickLook将其显示为0x0图像;Chrome旋转3分钟,然后显示损坏的图像标签;一个简单的CoreImage查看器将其显示为正确的大小(或至少非常宽),但纯黑…没有正确显示。LibreOffice Draw最终打开了它…我得到了一个非常错误的形状(比宽高得多…但尺寸声称它有0像素高)奇怪的红色条纹。终于找到了可以处理它的东西:ImageMagick。所以,你可以用它来裁剪,比如说,最右边的512x512,然后在另一个程序中查看它,看看它是真的静态的,还是仅仅是你的查看器。但是在PIL本身中测试可能更简单:重新打开巨文件,裁剪最右边的512x512,然后保存并查看它,或者只是
getpixel
并检查值……哈哈哈。另一件我没有提到的事情是img.show()显示图像。我猜是因为它也会压缩一点。您可以在较小的图像中看到压缩(它会变成.jpeg)。我想,如果你想办法打开它,请告诉我。@Wufufu:好吧,这给了你一个简单的测试,以确保它实际上是
图像。保存
这是罪魁祸首:保存图像,重新打开,然后显示它。