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

Python图像裁剪报错:OSError: cannot write mode F as JPEG及imageio版本疑问

问题解答:OSError: cannot write mode F as JPEG 及imageio版本疑问

用户问题

我是Python新手,为完成作业编写了图像裁剪函数,运行代码时出现指向非自身代码行的错误,错误信息为:OSError: cannot write mode F as JPEG。此外,我不解为何必须使用imageio.read或imageio.v2.read。附上完整报错信息及我的代码,恳请帮助解决。

完整报错信息

Traceback (most recent call last):
File "C:\Users\מחשב\AppData\Roaming\Python\Python310\site-packages\PIL\JpegImagePlugin.py", line 650, in _save
rawmode = RAWMODE[im.mode]
KeyError: 'F'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
File "C:\Users\מחשב\Desktop\python\עיבוד תמונה\חיתוך.py", line 16, in <module>
imageio.v2.imwrite('crop_img.jpg', new_pic)
File "C:\Users\מחשב\AppData\Roaming\Python\Python310\site-packages\imageio\v2.py", line 396, in imwrite
with imopen(uri, "wi", **imopen_args) as file:
File "C:\Users\מחשב\AppData\Roaming\Python\Python310\site-packages\imageio\core\v3_plugin_api.py", line 367, in __exit__
self.close()
File "C:\Users\מחשב\AppData\Roaming\Python\Python310\site-packages\imageio\plugins\pillow.py", line 144, in close
self._flush_writer()
File "C:\Users\מחשב\AppData\Roaming\Python\Python310\site-packages\imageio\plugins\pillow.py", line 485, in _flush_writer
primary_image.save(self._request.get_file(), **self.save_args)
File "C:\Users\מחשב\AppData\Roaming\Python\Python310\site-packages\PIL\Image.py", line 2439, in save
save_handler(self, fp, filename)
File "C:\Users\מחשב\AppData\Roaming\Python\Python310\site-packages\PIL\JpegImagePlugin.py", line 653, in _save
raise OSError(msg) from e
OSError: cannot write mode F as JPEG

用户代码

import numpy as np
import imageio

def pic_crop(img,height,dy,width,dx):
    new_img=np.zeros((dy,dx))
    for row in range(0,dy):
        for column in range(0,dx):
            new_img[row,column]=img[height+row,width+column]
return new_img

pic=imageio.v2.imread('myimageGR.jpg')
new_pic= pic_crop(pic,30,90,50,80)
print(new_pic.shape)
imageio.v2.imwrite('crop_img.jpg', new_pic)

解决方案

1. 修复OSError: cannot write mode F as JPEG错误

  • 问题原因:np.zeros()默认生成float64类型数组,而JPEG格式仅支持8位无符号整数(uint8)的图像数据,报错里的mode F代表浮点型,因此无法保存。
  • 修复方法:
    方法一:初始化数组时指定数据类型
    修改pic_crop函数中的数组创建代码:
    new_img = np.zeros((dy, dx), dtype=np.uint8)
    
    方法二:保存前转换数组类型
    在调用imwrite前添加类型转换:
    new_pic = new_pic.astype(np.uint8)
    
  • 优化建议:用numpy切片替代手动循环,代码更简洁高效:
    def pic_crop(img, height, dy, width, dx):
        return img[height:height+dy, width:width+dx]
    

2. 关于imageio.v2.imread的说明

imageio 3.x版本重构了API,旧版imageio.imread被迁移到imageio.v2.imread下。新版本默认使用v3 API,其imread用法与旧版差异较大(需配合imopen)。为了兼容原有代码逻辑,官方保留了v2接口,因此需要使用imageio.v2.imread来避免API变化导致的问题,同时也会消除版本兼容警告。


内容的提问来源于stack exchange,提问作者sariel jan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 09:43:26