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”