如何在python的文件夹中使用PIL调整图像大小

时间:2019-05-24 12:58:39

标签: python python-imaging-library

我正在使用PIL / Python调整文件夹中图像的大小。调整图像大小后,我想再次将它们保存在具有相同名称的相同文件夹中,但出现错误无法将RGBA模式写入JPEG

文件夹中有多种图像格式

这是用于调整图像大小的代码

path = "data/images/"
dirs = os.listdir( path )

def resize():
    for item in dirs:
        if os.path.isfile(path+item):
            im = Image.open(path+item)
            f, e = os.path.splitext(path+item)
            imResize = im.resize((200,200), Image.ANTIALIAS)
            imResize.save(f, 'JPEG', quality=90)

resize()

这是我遇到的错误

cannot write mode RGBA as JPEG

2 个答案:

答案 0 :(得分:0)

尝试:-

f = "apple.png"
im = Image.open(path+item)
im = im.convert("RGB") 
imResize = im.resize((200,200), Image.ANTIALIAS)
imResize.save(f, quality=90)

我们从图像中删除了alpha通道,并将颜色空间仅转换为RGB。由于大多数文件格式都支持具有RGB颜色空间的图像,因此我认为错误仍然不会继续存在。

不要将所有输入图像的输出格式明确定义为.jpeg,而是让PIL通过查看文件的扩展名来确定它。

P.S。:-:如果考虑到图像的透明度(alpha通道),请不要使用此方法,因为此方法将摆脱图像的alpha通道。

答案 1 :(得分:0)

要调整图像大小,我一直使用.thumbnail。它易于使用且简单易用。 为了保留颜色和Alpha的数据,Vasu Deo.S带来的解决方案效果很好,这是我在脚本中使用的解决方案。

您需要将图像保存在.png中而不是.jpeg中,以免出现Alpha通道错误。

这就是您实际编辑的代码。

path = "data/images/"
dirs = os.listdir( path )

def resizeImages():
    for item in dirs:
        if os.path.isfile(path+item):
            im = Image.open(path+item)
            im = im.convert('RGBA')

            size = 200, 200

            imResize.thumbnail(size)

            f, e = os.path.splitext(path+item)
            imResize.save(f+'.png')

请注意,这将需要另存为.png。如果要另存为.jpeg图像,则必须使用以下方法消除Alpha通道:

path = "data/images/"
dirs = os.listdir( path )

def resizeImages():
    for item in dirs:
        if os.path.isfile(path+item):
            im = Image.open(path+item)
            im = im.convert('RGBA')

            data = np.array(im)
            red, green, blue, alpha = data.T

            alpha_areas = (red == 0) & (blue == 0) & (green == 0) & (alpha == 0) # set alpha to 0
            data[..., :-1][alpha_areas.T] = (255,255,255)
            im = Image.fromarray(data)

            size = 200, 200

            imResize = im.thumbnail(size)

            f, e = os.path.splitext(path+item)
            imResize.save(f+'.png')