首页 文章

如何使用PIL保存图像?

提问于
浏览
69

我刚刚使用Python图像库(PIL)进行了一些图像处理,使用我之前发现的帖子来执行图像的傅里叶变换,我无法使用保存功能 . 整个代码工作正常,但它不会保存生成的图像:

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'

如何使用Pythons PIL保存图像?

4 回答

  • 5

    已处理有关文件扩展名的错误,您可以使用 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')
    
  • 90

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

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

    尝试删除 .bmp 之前的 . (它与预期的 BMP 不匹配) . 正如您从错误中看到的那样, save_handler 是您提供的 format 的上限,然后在 SAVE 中查找匹配项 . 但是,该对象中的相应键是 BMP (而不是 .BMP ) .

    我对 PIL 并不是很了解,但是从一些快速搜索来看,这似乎与图像的 mode 有关 . 将 j 的定义更改为:

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

    似乎为我工作(但请注意,我对 PIL 知之甚少,所以我建议使用@mmgp的解决方案,因为他/她清楚地知道他们在做什么:)) . 对于 mode 的类型,我使用了this页面 - 希望其中一个选择对你有用 .

  • 20

    我知道这是旧的,但我发现(使用Pillow时)使用 open(fp, 'w') 打开文件,然后保存文件将起作用 . 例如:

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

    fp 当然是文件路径 .

相关问题