PIL - 图像不旋转

3

我很好奇为什么我的图片没有旋转,每次结束都停留在同一个位置。

img = Image.open(r'C:\Users\Brett\Downloads\testing.jpg')
exif_data = {
    TAGS[k]: v
    for k, v in img._getexif().items()
    if k in TAGS
}
print(exif_data['Orientation'])

输出结果为“6”

无论我告诉图像旋转多少度,它最终都会停留在同一位置。

if exif_data['Orientation'] == 6:
    img.rotate(90)

或者

if exif_data['Orientation'] == 6:
    img.rotate(270) 

或者

if exif_data['Orientation'] == 6:
    img.rotate(180)

我总是得到一个向逆时针旋转90度的图像。我是否做错了什么明显的事情?


2
你保存了旋转后的图像吗? - rfkortekaas
3个回答

7

从 (DOCS) 中得知:

Image.rotate(angle, resample=0, expand=0, center=None, translate=None)

返回此图像的旋转副本。该方法返回一个此图像的副本,将其绕其中心逆时针旋转给定数量的度数。

图像不是就地旋转的。您需要存储从 rotate() 返回的图像。也许可以这样做:

if exif_data['Orientation'] == 6:
    new_image = img.rotate(180)

谢谢。这样做很有道理。 - BrettJ
2
是的,但动词“rotate”听起来像是就地旋转。也许他们应该称其为“rotated”? - Stephen Rauch

1
除了上面提出的建议答案,你也可以只做以下操作。
if exif_data['Orientation'] == 6:
    img = img.rotate(90)

或者

if exif_data['Orientation'] == 6:
    img = img.rotate(270)

或者

if exif_data['Orientation'] == 6:
    img = img.rotate(180)

此外,正如上面提到的,您可能需要设置扩展参数,例如以下内容,以确保旋转图像不会超出画布范围。
if exif_data['Orientation'] == 6:
    img.rotate(180,expand=1)

0
我也曾遇到同样的问题:如果你旋转图像,你也应该修改 exif。
from PIL import Image
from exif import Image as Image2


def check_rotation(how, rotat):
    if "must be horizontal":
        if rotat == 6:
            return 1
        elif rotat == 8:
            return 3
        return None
    elif "must be vertical":
        if rotat == 3:                
            return 6
        elif rotat == 1:
            return 8
        return None
    else:
        raise "wrong how"

with Image.open(old_file, "r") as im:
    try:
        rotation = im._getexif()[274]
    except:
        raise "Failed to load exif with PIL"

    result = check_rotation("must be vertical", rotation)
    if result:
        print("rotated")
        # this ment the image must be rotated by 90 degrees and the exif_rotation will be updated by what the function returns
        im.transpose(Image.ROTATE_90)
        rotation = result  
    im.save(fp=f"{new_file}.jpg", format="JPEG", exif=im.info['exif'], quality=90)
    # here you see that it actually didn't rotate yet

with open(f"{new_file}.jpg", "rb") as im_file:
    imexif = Image2(im_file)
    if imexif.has_exif:
        # Updating exif rotation
        if imexif.get("orientation"):
            try:
                imexif.orientation = rotation
                # now it will rotate
            except:
                print("failed to modify EXIF orientation")
    # Writing the EXIF
    with open(f"{new_file}.jpg", 'wb') as updated_file:
        updated_file.write(imexif.get_file())

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接