使用 PIL 保存图像
Posted
技术标签:
【中文标题】使用 PIL 保存图像【英文标题】:Saving Image with PIL 【发布时间】:2013-11-08 04:26:28 【问题描述】:我正在尝试保存使用 PIL 从头开始创建的图像
newImg1 = PIL.Image.new('RGB', (512,512))
pixels1 = newImg1.load()
...
for i in range (0,511):
for j in range (0,511):
...
pixels1[i, 511-j]=(0,0,0)
...
newImg1.PIL.save("img1.png")
我收到以下错误:
Traceback(最近一次调用最后一次):文件“”,第 1 行,in 文件 "C:\Python27\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", 第 523 行,在运行文件中 execfile(文件名,命名空间)文件“C:\Python27\Lib\site-packages\xy\pyimgmake.py”,第 125 行,在 newImg1.PIL.save("img1.png") 文件“C:\Python27\lib\site-packages\PIL\Image.py”,第 512 行,在 getattr 中 raise AttributeError(name) AttributeError: PIL
我需要帮助解释此错误以及如何将图像正确保存为“img1.png”(我可以将图像保存到默认保存位置)。
更新:
from PIL import Image as pimg
...
newImg1 = pimg.new('RGB', (512,512))
...
newImg1.save("img1.png")
我收到以下错误:
... newImg1.save("img1.png") 文件 “C:\Python27\lib\site-packages\PIL\Image.py”,第 1439 行,保存中 save_handler(self, fp, filename) 文件“C:\Python27\lib\site-packages\PIL\PngImagePlugin.py”,第 572 行,在 _保存 ImageFile._save(im, _idat(fp, chunk), [("zip", (0,0)+im.size, 0, rawmode)]) 文件 "C:\Python27\lib\site-packages\PIL\图像文件.py", 第 481 行,在 _save e = Image._getencoder(im.mode, e, a, im.encoderconfig) 文件“C:\Python27\lib\site-packages\PIL\Image.py”,第 399 行,在 _getencoder return apply(encoder, (mode,) + args + extra) TypeError: an integer is required
【问题讨论】:
从newImg1.PIL.save("img1.png")
中删除PIL.
,然后尝试。
您从哪里了解到使用 newimg1.PIL.save()?您是否发明了新的 API 方法?
因创造性地使用新的 API 方法或在未检查任何文档的情况下尝试某事而被否决。
那是我的最后一次尝试......我已经用上述建议产生的错误更新了帖子
【参考方案1】:
PIL 不是 newImg1 的属性,但 newImg1 是 PIL.Image 的一个实例,因此它有一个保存方法,因此以下应该可以工作。
newImg1.save("img1.png","PNG")
请注意,仅调用文件 .png 并不能使其成为一体,因此您需要将文件格式指定为第二个参数。
尝试:
type(newImg1)
dir(newImg1)
和
help(newImg1.save)
【讨论】:
扩展答案。请注意,保存的参数列表因格式而异。 您仍然留在导致原始错误的save
调用中的.PIL
。
这就是我在全身麻醉的影响下编辑得到的结果。
感谢您的新答案。不过时间用完了,所以我实际上只是将 PIL 传递给了 matplotlib 函数。出于某种原因,以这种方式保存它没有任何问题......我想不管用什么。
docs now state 的格式 由文件名确定,因此 newImg1.save('img1.png')
现在应该可以使用了。【参考方案2】:
因为我讨厌看到没有完整答案的问题:
from PIL import Image
newImg1 = Image.new('RGB', (512,512))
for i in range (0,511):
for j in range (0,511):
newImg1.putpixel((i,j),(i+j%256,i,j))
newImg1.save("img1.png")
产生一个测试模式。
要在图像上使用数组样式寻址而不是 putpixel,请转换为 numpy 数组:
import numpy as np
pixels = np.asarray(newImg1)
pixels.shape, pixels.dtype
-> (512, 512, 3), dtype('uint8')
【讨论】:
【参考方案3】:试试这个:
newImg1 = pimg.as_PIL('RGB', (512,512))
...
newImg1.save('Img1.png')
【讨论】:
以上是关于使用 PIL 保存图像的主要内容,如果未能解决你的问题,请参考以下文章
Python使用PIL基于坐标范围批量剪裁(图像)并将剪裁后的图像保存到指定的新文件夹中
如何将 Matplotlib 图形转换为 PIL Image 对象(不保存图像)