0

使用 Image.filter(ImageFilter.BLUR) 方法模糊图像时出现问题。

我的代码:

#Open the image from the ImageField
fp_big = open(self.image_big.path, 'rb')
im_big = Image.open(StringIO(fp_big.read()))

#Resize the image
im_big.thumbnail(size_big, Image.ANTIALIAS)

#Blur the image
im_big = im_big.convert('RGB')
for i in range(10):
    im_big = im_big.filter(ImageFilter.BLUR)

#Save the images
temp_handle_big = StringIO()
im_big.save(temp_handle_big, PIL_TYPE)
temp_handle_big.seek(0)

#Save image to a SimpleUploadedFile which can be saved into ImageField
suf_big = SimpleUploadedFile('%s' % os.path.split(self.image_big.name)[-1], temp_handle_big.read(), content_type=IMG_TYPE)

#Delete old images and close fps
fp_big.close()
os.remove(original_path_big)

虽然此代码工作正常,但结果部分错误:

调整大小的图像 图像模糊

如您所见,图像的边缘没有正确模糊。有谁知道为什么会这样?

提前谢谢。

4

1 回答 1

0

这似乎是过滤库中的一个错误。许多过滤器使用 NxN 矩阵,该矩阵基本上是“任何像素都是自身的组合加上周围像素的各种组合”

但是,当您到达图像的边缘时该怎么办?看起来 PIL 根本没有在那里应用过滤器,因为矩阵会与边缘重叠并给你无效的结果。如果您只进行了一次迭代,可能不会引人注意,但在 10 次迭代中......哇!

我的建议是通过复制相邻的像素颜色,应用滤镜,然后将它们裁剪回来,将那一侧的图像边缘扩展一两个像素。

或者,使缩略图比需要的大,过滤,然后裁剪。这样你会丢失一些数据,但它是一个更简单的解决方案。

于 2012-11-22T21:40:20.507 回答