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
相关产品推荐
相关产品推荐

