3

当我调用 PIL 来缩略图()图像,然后裁剪()时,我在最后一行像素上出现伪影——它们要么大部分是黑色的,带有强烈的颜色斑点,要么似乎是一个未调整大小的区域图像的(即,该行像素处于原始分辨率,并且没有随其余像素按比例缩小)

这似乎不会发生在没有裁剪的 thumbnail() 上。无论我是否在裁剪后的图像上调用 load() 都会发生这种情况。

为了在视觉上解决这个问题,我一直在缩略图上放大 1 像素,然后裁剪到相同的大小。这似乎行得通。不过,这有点肮脏。我想知道是否有适当的解决方法。

4

1 回答 1

2

是的,这也发生在我身上。这对我来说是一个学习练习,因为我从未使用 PIL 裁剪或创建缩略图......

缩略图(大小,过滤器=无)

用给定大小的新图像替换原始图像(第 2 页)。可选的过滤器参数的工作方式与 .resize() 方法相同。此操作保留纵横比(高度:宽度)。生成的图像将尽可能大,同时仍适合给定尺寸。例如,如果图像 im 的大小为 (400,150),则其在 im.thumbnail((40,40)) 之后的大小将为 (40,15)

所以正在发生的事情是

  1. 您使用缩略图来保持方面
  2. 您期望图像为 40 x 40
  3. 您正在裁剪超出缩略图的实际大小
  4. 由于裁剪超出尺寸,底部很可能出现黑色条带

我写的重复这个问题的代码:

def croptest(file, width, height):
    import Image as pil
    import os

    max_width = width
    max_height = height
    file, ext = os.path.splitext(file)

    img = pil.open(file)
    img.thumbnail((max_width, max_height), pil.ANTIALIAS)
    img.save(file + ".thumb.jpeg", 'JPEG')
    croppedImage = img.crop((10, 10, 40, 40))
    croppedImage.save(file + ".croppedthumb.jpeg", 'JPEG')

if __name__ == "__main__":
   croptest("Desktop.bmp", 50, 50)

Desktop.thumb.jpeg 是 50 x 37,而 Desktop.croppedthumb.jpeg 是 30 x 30,所以我在底部有一条 3 像素高的黑线。

您的解决方案是在缩略图的实际大小内进行裁剪,或者弄清楚如何创建忽略纵横比的缩略图。

于 2010-02-22T21:58:46.000 回答