在Python中裁剪图像时出现错误,需帮助

0 投票
1 回答
33 浏览
提问于 2025-04-12 17:50

我刚开始学习Python,最近为了作业写了一个函数,想要裁剪一张图片。

但是当我运行代码时,出现了一个错误,指向的行在我的代码里根本找不到。

错误信息是:

OSError: 不能将模式F写入JPEG格式

还有一个小问题。它让我必须输入imagio.readimageio.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 个回答

1

new_img.dtype 的类型是 float64,而 imageio.v2.imwrite 在处理jpeg格式时需要的是 uint8 类型,所以你可以选择以下两种方法之一:

new_img=np.zeros((dy,dx),dtype='uint8')

或者你也可以选择下面这个方法:

imageio.v2.imwrite('crop_img.jpg', new_pic.astype('uint8'))

另外,你可以简化一下 pic_crop 的代码,这样就能避免这个问题了。

def pic_crop(img,height,dy,width,dx):
    new_img = np.array(img[height:height+dy, width:width+dx])
    return new_img

撰写回答