如何使用 PIL 保存图像?

我刚刚使用 Python 图像库(PIL)完成了一些图像处理,使用的是我之前发现的一篇文章,该文章用于执行图像的傅立叶变换,但是我无法让 save 函数工作。整个代码运行良好,但是不能保存结果图像:

from PIL import Image
import numpy as np


i = Image.open("C:/Users/User/Desktop/mesh.bmp")
i = i.convert("L")
a = np.asarray(i)
b = np.abs(np.fft.rfft2(a))
j = Image.fromarray(b)
j.save("C:/Users/User/Desktop/mesh_trans",".bmp")

我得到的错误如下:

save_handler = SAVE[string.upper(format)] # unknown format
KeyError: '.BMP'

如何使用 Python PIL 保存图像?

428918 次浏览

尝试在 .bmp之前删除 .(它不像预期的那样匹配 BMP)。正如您可以从错误中看到的,save_handler是您提供的 format的大写形式,然后在 SAVE中寻找匹配。但是该对象中的相应键是 BMP(而不是 .BMP)。

关于 PIL我知道的不多,但是从一些快速搜索周围似乎是一个与图像的 mode的问题。将 j的定义改为:

j = Image.fromarray(b, mode='RGB')

似乎对我很有用(不过要注意,我对 PIL知之甚少,所以我建议使用@mmgp 的解决方案,因为她/他清楚地知道自己在做什么:)。对于类型的 mode,我使用 这个页-希望其中一个选择将为您工作。

您应该能够简单地让 PIL 从扩展名获取文件类型,即使用:

j.save("C:/Users/User/Desktop/mesh_trans.bmp")

关于文件扩展名的错误已经得到处理,您可以使用 BMP(不带点) ,或者已经使用扩展名传递输出名称。现在,为了处理错误,您需要在频率域中正确地修改数据,将其保存为一个整数图像,PIL告诉您,它不接受浮点数据保存为 BMP。

这里有一个建议(稍作修改,比如使用 fftshiftnumpy.array而不是 numpy.asarray) ,用于进行适当的可视化转换:

import sys
import numpy
from PIL import Image


img = Image.open(sys.argv[1]).convert('L')


im = numpy.array(img)
fft_mag = numpy.abs(numpy.fft.fftshift(numpy.fft.fft2(im)))


visual = numpy.log(fft_mag)
visual = (visual - visual.min()) / (visual.max() - visual.min())


result = Image.fromarray((visual * 255).astype(numpy.uint8))
result.save('out.bmp')

我知道这是旧的,但我已经发现(当使用枕头)打开文件使用 open(fp, 'w'),然后保存文件将工作。例如:

with open(fp, 'w') as f:
result.save(f)

当然,fp是文件路径。