Python PIL - AttributeError:'NoneType'对象没有属性'save'

时间:2015-05-19 13:41:56

标签: python border python-imaging-library crop trim

我使用此代码使用PIL删除图像的边框:

def RemoveBlackBorders(img):
    bg = Image.new(img.mode, img.size, img.getpixel((0,0)))
    diff = ImageChops.difference(img, bg)
    diff = ImageChops.add(diff, diff, 2.0, -100)
    bbox = diff.getbbox()
    if bbox:
        return img.crop(bbox)

来自here

我用它来处理文件夹中包含的所有图像:

def CropImages():
    global FOLDER
    for i in range(1, len(os.listdir(FOLDER))+1):
        image = FOLDER + "\\" + str(i) + ".jpg"
        img = Image.open(image)
        img = RemoveBlackBorders(img)
        img.save(image, "JPEG")

一切正常,程序完成了他的工作。问题是如果在文件夹中有一个完整的黑色图像(被检测为“边框”),程序卡住了我的错误:

 AttributeError: 'NoneType' object has no attribute 'save'

即使黑色图像是系列中的最后一个图像,文件夹中的所有图像都不会被裁剪。有没有办法跳过这个图像或删除它(这会更好)?

2 个答案:

答案 0 :(得分:2)

EAFP的Python原则可以在这里应用。

基本上你应该尝试执行代码,然后捕获一个AttributeError,告诉它跳过该图像。

像这样:

def CropImages():
    global FOLDER
    for i in range(1, len(os.listdir(FOLDER))+1):
        image = FOLDER + "\\" + str(i) + ".jpg"
        img = Image.open(image)
        img = RemoveBlackBorders(img)

        try:
            img.save(image, "JPEG")
        except AttributeError:
            print("Couldn't save image {}".format(image))

这只是意味着如果发现错误,它会打印消息然后继续循环。

答案 1 :(得分:1)

由于RemoveBlackBorders会为100%边框的图片返回None,因此您可以在决定是否保存时检查None

def CropImages():
    global FOLDER
    for i in range(1, len(os.listdir(FOLDER))+1):
        image = FOLDER + "\\" + str(i) + ".jpg"
        img = Image.open(image)
        img = RemoveBlackBorders(img)
        if img is not None:
            img.save(image, "JPEG")