使用PIL模块存储图像时的报错:cannot write mode P as JPEG

一、背景

最近我需要自己训练VGG模型,当然自己也采集了一部分数据。在VGG模型中,输入数据是224*224尺寸的,因此需要对数据进行批量resize处理,这是背景。

二、出现问题的原因

首先给出我批量resize图片的简单代码:

import os
from PIL import Image

# 将所有图像resize成224*224,并保存在目录'result/'下
def resize_image(image_name):
    # 获取输入文件夹中的所有文件
    files = os.listdir('./data/' + image_name)

    output_dir = './result/' + image_name
    # 判断输出文件夹是否存在,不存在则创建
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)

    for file in files:
        img = Image.open('./data/' + image_name + file)
        img = img.resize((224, 224), Image.ANTIALIAS)
        img.save(os.path.join(output_dir, file))


if __name__ == '__main__':
    resize_image('chengqiang/')

直接运行上述代码,然后就报错了:

对于这个问题的原因,查了一下,因为我使用的是PIL模块,对于PIL模块来说,其模式包括以下几种:

# 参考链接:https://www.jianshu.com/p/e8d058767dfa

模式
1             1位像素,黑和白,存成8位的像素
L             8位像素,黑白
P             8位像素,使用调色板映射到任何其他模式
RGB           3×8位像素,真彩
RGBA          4×8位像素,真彩+透明通道
CMYK          4×8位像素,颜色隔离
YCbCr         3×8位像素,彩色视频格式
I             32位整型像素
F             32位浮点型像素

报错原因也很明显,因为有图片的模式是“P”,不是"RGB",所以无法直接写入保存,找到这张图片,发现和普通的彩色图片并没有什么区别:

具体查看图片模式的方法为:

    img = Image.open('./data/chengqiang/117.jpg')
    print(img.mode)

三、问题解决方法

对于这个问题,需要做的也很简单,无非就是将模式“P”转化为“RGB”模式,再保存为“jpg”就可以了,所以只用增加两行代码:

    if img.mode == "P":
        img = img.convert('RGB')

可以看到添加后程序就能够顺利运行:

最后附上完整代码:

import os
from PIL import Image

# 将所有图像resize成224*224,并保存在目录'result/'下
def resize_image(image_name):
    # 获取输入文件夹中的所有文件
    files = os.listdir('./data/' + image_name)

    output_dir = './result/' + image_name
    # 判断输出文件夹是否存在,不存在则创建
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)

    for file in files:
        img = Image.open('./data/' + image_name + file)
        if img.mode == "P":
            img = img.convert('RGB')
        img = img.resize((224, 224), Image.ANTIALIAS)
        img.save(os.path.join(output_dir, file))


if __name__ == '__main__':
    resize_image('chengqiang/')

猜你喜欢

转载自blog.csdn.net/z704630835/article/details/84968767