Python PIL: 怎么保存裁剪后的图片?

7 投票
3 回答
25667 浏览
提问于 2025-04-16 20:09

我有一个脚本,它会生成一张图片,然后对这张图片进行裁剪。问题是,当我调用裁剪的方法之后,它并没有把裁剪后的图片保存到硬盘上。

crop = image.crop(x_offset, Y_offset, width, height).load()
return crop.save(image_path, format)

3 个回答

0

这里有一个完全可用的答案,适用于新的PIL版本1.1.7。现在裁剪的坐标是左上角右下角(不是x,y,宽度,高度)。

Python的版本号是:2.7.15

PIL的版本是:1.1.7

# -*- coding: utf-8 -*-

from PIL import Image
import PIL, sys

print sys.version, PIL.VERSION


for fn in ['im000001.png']:

    center_x    = 200
    center_y    = 500

    half_width       = 500
    half_height      = 100

    imageObject = Image.open(fn)

    #cropped = imageObject.crop((200, 100, 400, 300))


    cropped = imageObject.crop((center_x - half_width,
                                center_y - half_height, 
                                center_x + half_width,
                                center_y + half_height,
                                ))

    cropped.save('crop_' + fn, 'PNG')
1

主要的问题是试图把 load() 返回的对象当作图像对象来使用。从PIL的文档来看:

在[PIL] 1.1.6及之后的版本中,load返回的是一个像素访问对象,这个对象可以用来读取和修改像素。这个访问对象的行为就像一个二维数组 [...]

你可以试试这个:

crop = image.crop((x_offset, Y_offset, width, height))   # note the tuple
crop.load()    # OK but not needed!
return crop.save(image_path, format)
14

你需要把参数放在一个元组里,传给.crop()。而且不要使用.load()

box = (x_offset, Y_offset, width, height)
crop = image.crop(box)
return crop.save(image_path, format)

就这些了。不过,我不太明白你为什么要返回保存操作的结果,因为它返回的是None

撰写回答