这个函数为什么给我所有的图片加边框?

2 投票
3 回答
697 浏览
提问于 2025-04-16 10:29

我正在使用PIL这个库。

im = im.rotate(angle=-90, expand = True)

当我这样做的时候,它会给我的图片加上一个灰色的边框。

这是为什么呢?

这是我完整的代码。注意,如果我不旋转图片,就不会加边框。

def fixRotation(f, quality=96, image_type="JPEG"):
    #http://sylvana.net/jpegcrop/exif_orientation.html
    d =getEXIF(f)
    if d:
        orientation = int(d['Orientation'])
        im = Image.open(StringIO(f))
        if orientation == 6:
            im = im.rotate(angle=-90, expand = True)
        elif orientation == 3:
            im = im.rotate(angle=-180, expand=True)
        elif orientation == 8:
            im = im.rotate(angle=-270, expand=True)
        else:
            #It doesn't add a border here.
            im = im.rotate(0, expand=True)
        res = StringIO()
        im.save(res, image_type, quality=quality)
        res.seek(0)
        return res
    else:
        return StringIO(f)

3 个回答

0

在旋转图像的时候,这个算法其实是把每个像素的值和“下一个”像素的值进行平均。对于图像内部的所有像素,能找到下一个像素的值。但是对于图像边缘的像素来说,下一个像素的值是无法确定的。

所以,灰色的部分就是已知的边缘像素和一个无法确定的外部像素值的平均值。

0

请注意以下几点(CPython 2.6,PIL 1.1.7):

import Image
i= Image.open("someimage.jpg")
ir0= i.rotate(-90)
ir1= i.rotate(-90, expand=1)

for img in i, ir0, ir1:
    print(img.size)

# output follows
(720, 400)
(400, 720)
(401, 721)
  1. 当你旋转的角度是90的倍数时,expand这个参数就没必要用了。
  2. 在旋转90度、180度和270度的情况下,使用expand似乎会引发一个bug。

所以,如果你只关心90°、180°和270°的旋转,就可以直接去掉expand=1这个参数;更好的方法是使用transpose方法(具体可以查看PIL教程中的几何变换部分)。

1

我做了一些实验,确实发现图片的大小发生了变化,但我不太明白具体是怎么回事。在我看来,这像是PIL里的一个bug……你应该去报告一下。

如果你只需要旋转k*90度的话,其实也可以用numpy来进行旋转……

img = Image.fromarray(numpy.rot90(numpy.array(img), n))

n 是旋转90度的次数。

撰写回答