#!/usr/bin/env python3
from PIL import ImageOps, Image
from cairosvg import svg2png
from io import BytesIO
def frame(im, thickness=5):
# Get input image width and height, and calculate output width and height
iw, ih = im.size
ow, oh = iw+2*thickness, ih+2*thickness
# Draw outer black rounded rect into memory as PNG
outer = f'<svg width="{ow}" height="{oh}" style="background-color:none"><rect rx="20" ry="20" width="{ow}" height="{oh}" fill="black"/></svg>'
png = svg2png(bytestring=outer)
outer = Image.open(BytesIO(png))
# Draw inner white rounded rect, offset by thickness into memory as PNG
inner = f'<svg width="{ow}" height="{oh}"><rect x="{thickness}" y="{thickness}" rx="20" ry="20" width="{iw}" height="{ih}" fill="white"/></svg>'
png = svg2png(bytestring=inner)
inner = Image.open(BytesIO(png)).convert('L')
# Expand original canvas with black to match output size
expanded = ImageOps.expand(im, border=thickness, fill=(0,0,0)).convert('RGB')
# Paste expanded image onto outer black border using inner white rectangle as mask
outer.paste(expanded, None, inner)
return outer
# Open image, frame it and save
im = Image.open('monsters.jpg')
result = frame(im, thickness=10)
result.save('result.png')
5条答案
按热度按时间nxowjjhe1#
在我的第一个答案的评论中与Mark进行了一些讨论后,我决定使用OpenCV和NumPy来制作另一个解决方案,它能够轻松地将一些真实的图像(例如照片)提供给该方法,并获得包括圆角边框和边框外透明度的图像!
字符串
这和我在另一个答案中使用的概念是一样的,只是在正确的透明度问题上多写了一些代码。
一些示例性输入:
x1c 0d1x的数据
相应的输出:
的
另一个输入和参数集:
的
型
输出量:
希望也有帮助!
型
qeeaahzv2#
我喜欢用SVG画圆角矩形,这是一种改变--不仅仅是因为有人认为我总是使用ImageMagick ;-)
字符串
输出图片
x1c 0d1x的数据
输入图片
的
您可以使用
rx
和ry
来更改角的半径。这里是
outer
,inner
和expanded
-正如你所看到的,它们都是相同的大小,以便在彼此之上进行组合。的
其他想法:
使用15 x15的中值滤波器,你会得到:
如果有人想要一个ImageMagick解决方案:
型
Keywords:Python,图像处理,圆角,圆角,边框,SVG,cairo,cairosvg,SVG to PNG,SVG as PNG,SVG to PIL,PIL,Pillow。
hlswsv353#
当然,Mark会使用ImageMagick提供一个很好的解决方案。但是,因为你的问题是用Pillow标记的,其他人可能也在寻找解决方案,这里是我的手动实现,因为我怀疑,有一个现成的内置方法:
字符串
基本上,它是计算和手动绘制四个弧,四个边缘与所需的厚度和颜色的边界,然后泛色填充矩形与初始矩形的颜色。把它放在一些方法,并在需要时重用它,所以没有混乱的主要代码。
对于指定的图像和参数集,我们得到输出(Matplotlib图在这里):
x1c 0d1x的数据
对于另一个图像和参数集,
型
我们得到,例如:
的
希望能帮上忙!
型
8ljdwjyq4#
这里是另一种使用Python/OpenCV的方法。然而,在这种方法中,边框将在输入图像的边界内。
输入:
x1c 0d1x的数据
字符串
阈值1图像:
的
阈值2图像:
的
边框蒙版图像:
结果图像:
添加
这里是对上面的修正,允许更多的厚度和半径值。示例使用厚度21和半径81。
型
测试结果:
csga3l585#
这里是一个简单的实现只是枕头:
字符串
之前:https://i.stack.imgur.com/Cm92N.jpg
后:https://i.stack.imgur.com/3HIuK.jpg