You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:16:56