是否有一个简单的解决方案来修剪PIL中的图像空白?
ImageMagick可以通过以下方式轻松支持它:
convert test.jpeg -fuzz 7% -trim test_trimmed.jpeg
我找到了PIL的解决方案:
from PIL import Image, ImageChops
def trim(im, border):
bg = Image.new(im.mode, im.size, border)
diff = ImageChops.difference(im, bg)
bbox = diff.getbbox()
if bbox:
return im.crop(bbox)
但这种解决方案有缺点:
border
颜色,这对我来说不是什么大问题,我的图片有白色背景-fuzz
密钥。添加一些模糊裁剪。因为我可以有一些jpeg压缩工件和不需要的巨大阴影。答案 0 :(得分:97)
我认为PIL内置的任何东西都不能做到这一点。但我修改了你的代码,所以它会这样做。
getpixel
从左上角的像素获取边框颜色,因此您无需传递颜色。100, 100, 100
(在我的示例中)下的所有值饱和为零的快速方法。因此,一种巧妙的方法可以消除因压缩而产生的任何“摆动”。代码:
from PIL import Image, ImageChops
def trim(im):
bg = Image.new(im.mode, im.size, im.getpixel((0,0)))
diff = ImageChops.difference(im, bg)
diff = ImageChops.add(diff, diff, 2.0, -100)
bbox = diff.getbbox()
if bbox:
return im.crop(bbox)
im = Image.open("bord3.jpg")
im = trim(im)
im.show()
重度压缩的jpeg:
裁剪:
吵闹的jpeg:
裁剪:
答案 1 :(得分:2)
使用wand http://docs.wand-py.org/en/0.3-maintenance/wand/image.html
trim(color = None,fuzz = 0) 从图像中删除实线边框。默认情况下使用左上角像素作为参考,或者您也可以指定要删除的颜色。
答案 2 :(得分:2)
在ufp.image模块上使用trim函数。
import ufp.image
import PIL
im = PIL.Image.open('test.jpg', 'r')
trimed = ufp.image.trim(im, fuzz=13.3)
trimed.save('trimed.jpg')