MacOS下使用Pillow实现JPG转BMP遇问题求助
用Pillow实现JPG转BMP的正确方案
首先,如果你只是想单纯完成JPG到BMP的格式转换,不需要额外图像处理的话,Pillow的代码其实非常简洁,一行核心操作就能搞定,生成的BMP和原图完全一致:
from PIL import Image # 打开JPG图片并直接保存为BMP格式 with Image.open("xhty23.jpg") as img: img.save("xhty23.bmp")
为什么你的代码会出问题?
咱们来拆解你遇到的图像差异和报错原因:
1. 图像与原图差异极大
你在代码里额外做了灰度转换+FFT傅里叶变换+频谱可视化操作,这已经不是单纯的格式转换了,而是对图像做了频域处理,最终生成的是图像的频谱图,自然和原图完全不同。如果你的目标只是转格式,这些处理步骤完全不需要。
2. 第一个报错:KeyError: '.BMP'
在j.save("a", ".bmp")这行中,第二个参数是格式标识,应该传入不带点的格式名称(比如"BMP"),而不是带点的.bmp。正确写法可以是j.save("a", "BMP"),或者直接写带.bmp后缀的文件名,让Pillow自动识别格式。
3. 第二个报错:OSError: cannot write mode F as BMP
这是核心问题:你用Image.fromarray(b)生成的图像模式是F(32位浮点型),而Pillow的BMP插件不支持这种模式。BMP支持的常见模式是RGB、L(8位灰度)、P(调色板)等,所以必须把浮点数组转换为8位无符号整数(uint8)格式,同时将数值范围调整到0-255之间。
如果你确实需要处理FFT后保存为BMP
如果你的真实需求是对图像做FFT处理后再保存为BMP,可以修正代码如下:
from PIL import Image import numpy as np # 打开图片并转为灰度图 img = Image.open("xhty23.jpg").convert('L') im = np.array(img) # 执行FFT并做可视化处理 fft_mag = np.abs(np.fft.fftshift(np.fft.fft2(im))) visual = np.log(fft_mag + 1) # 加1避免log(0)报错 # 将数值归一化到0-255区间 visual = (visual - visual.min()) / (visual.max() - visual.min()) * 255 # 转换为uint8类型(关键步骤,让图像模式符合BMP要求) visual = visual.astype(np.uint8) # 生成图像并保存为BMP result = Image.fromarray(visual) result.save('out.bmp')
内容的提问来源于stack exchange,提问作者Jay
相关产品推荐
相关产品推荐

