使用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)
虽然这段代码工作正常但结果却是错误的:
如您所见,图像边缘未正确模糊。有谁知道为什么会这样?
提前谢谢。答案 0 :(得分:0)
这似乎是过滤库中的错误。许多滤镜使用NxN矩阵,基本上“任何像素都是它自身的组合加上它周围像素的各种组合”
但是,到达图像边缘时该怎么办?似乎PIL根本就没有在那里应用滤波器,因为矩阵会与边缘重叠并给出无效结果。如果你只进行一次迭代,可能不会引人注意,但是在10次迭代中......哇!
我的建议是通过复制相邻的像素颜色,应用滤镜,然后将它们裁剪回来,将图像边缘延伸一两个像素。
或者,使缩略图大于其需要,过滤,然后裁剪。你会以这种方式丢失一些数据,但它更容易解决。