如何在使用PIL旋转图像时保持图像质量

13

基本上我想通过用户界面旋转图像,但是我注意到每次旋转后图像质量严重降低。有人知道如何解决吗?还有,当图像被旋转时,它每次都会裁剪掉部分图像。

以下是一些旋转前后的图片:http://imgur.com/a/QESKs

这是代码:

def onRotate(self):
    tanTheta = float(hh)/float(ww) 
    theta = math.atan(tanTheta) * 57.2957795 # convert to degrees
    if theta > 0:
        angle = (90 - theta) * -1
        clockwise = True
    elif theta < 0:
        angle = (270 - theta) * -1
        clockwise = False
    else:
        tkMessageBox('Angle not okay', 'Try again!')
    rotated_small = photo_small.rotate(angle) 
    rotated_small.save('small_rotate.jpg')
    self.load_imgfile('small_rotate.jpg')
3个回答

18
rotated_small = photo_small.rotate(angle, resample=Image.BICUBIC, expand=True)

这会告诉它使用最高质量的插值算法,并将图像扩展到完全囊括旋转后的尺寸,而不是进行裁剪。文档没有说明背景将填充什么颜色。


1
所以我认为应该使用resample=Image.BICUBIC而不是filter=Image.BICUBIC。但这肯定有效!谢谢!! - loonyuni
@user2525507,我使用的文档http://effbot.org/imagingbook/image.htm好像有误。我会修正回答。 - Mark Ransom
@MarkRansom 嗯,这对我来说不起作用。你有什么想法可以让我看看为什么它不起作用吗? - Daniel Goldfarb
@DanielGoldfarb 你需要指定Python和PIL或Pillow的版本。然后,你需要更明确地说明“不起作用”的含义。最好通过提出一个新问题来解决这个问题 - 如果你愿意,可以指向这个问题。 - Mark Ransom
@MarkRansom 谢谢。请看这里:https://stackoverflow.com/questions/59504849/ - Daniel Goldfarb

6
一个图像是由像素组成的网格。如果你旋转它(且角度不是90的倍数),旋转后的网格必须与一个新的非旋转的网格匹配才能显示图像。在这个过程中,一些损失是无法避免的。
唯一的选择是将未旋转的图像保留在某处,并累加多次旋转的角度,总是从最初未旋转的图像构建旋转后的图像。

1
并且你能把这些无意义的话翻译成一些代码吗? - Boz

1

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