PIL 无法将模式 F 写入 jpeg

Posted

技术标签:

【中文标题】PIL 无法将模式 F 写入 jpeg【英文标题】:PIL cannot write mode F to jpeg 【发布时间】:2013-05-19 05:04:46 【问题描述】:

我正在拍摄 jpg 图像并使用 numpy 的 fft2 创建/保存新图像。但是它会引发此错误

"IOError: cannot write mode F as JPEG" 

PIL 中的 CMYK 和 JPEG 文件是否存在问题???

p = Image.open('kibera.jpg')
bw_p = p.convert('L')
array_p = numpy.asarray(bw_p)
fft_p = abs(numpy.fft.rfft2(array_p))
new_p = Image.fromarray(fft_p)
new_p.save('kibera0.jpg')
new_p.histogram()

【问题讨论】:

【参考方案1】:

尝试将图像转换为 RGB:

...
new_p = Image.fromarray(fft_p)
if new_p.mode != 'RGB':
    new_p = new_p.convert('RGB')
...

【讨论】:

如果图像是灰度的怎么办? 凹凸,如果我要保存为灰度呢? 就用这个吧。它也适用于灰度。【参考方案2】:

Semente 的答案适用于彩色图像 对于灰度图像,您可以在下面使用:-

new_p = Image.fromarray(fft_p)
new_p = new_p.convert("L")

如果您将new_p = new_p.convert('RGB') 用于灰度图像,则图像仍将具有 24 位深度而不是 8 位,并且将占用硬盘大小的三倍,它不会是真正的灰度图像。

【讨论】:

更多关于转换的信息:pillow.readthedocs.io/en/stable/reference/…【参考方案3】:

我认为您的 fft_p 数组可能是浮点类型,并且图像的每个像素都应该采用 0-255 格式(即 uint8),所以也许您可以在从数组创建图像之前尝试这样做:

fft_p = fft_p.astype(np.uint8)
new_p = Image.fromarray(fft_p)

但请注意,fft_p 数组中的每个元素都应在 0-255 范围内,因此您可能需要先对其进行一些处理才能获得所需的结果,例如,如果您的每个元素都是在 0 和 1 之间浮动,您可以将它们乘以 255。

【讨论】:

这是真正的答案,因为它不会改变 numpy 数组的实际值(只是类型格式)。 非常有用的提示应该是uint8。我试图在 jupyter 上预览 mnist 灰度数据并遇到了这个问题。正确的代码应该像`Image.fromarray((mnist_images[0]*255).astype(np.uint8))

以上是关于PIL 无法将模式 F 写入 jpeg的主要内容,如果未能解决你的问题,请参考以下文章

对 JPG 图像进行操作时出现“无法将模式 P 写入 JPEG”

第96天:图像库 PIL

第96天:图像库 PIL

python图像处理图像水印和PIL模式转化

不支持的 BMP 压缩 - BMP 到 JPEG - PIL - Python

GIF 和 JPEG 的 Python 和 PIL 像素值不同