本文主要是介绍python图片四角圆角处理中的细节——图片变黑问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
python 四角圆角处理是基于以下一段代码:
def imageRadiusProcessing(img, radius = 30):circle = Image.new('L', (radius * 2, radius * 2), 0)draw = ImageDraw.Draw(circle)draw.ellipse((0, 0, radius * 2, radius * 2), fill = 255)w, h = img.sizealpha = Image.new('L', img.size, 255)upperLeft, lowerLeft = circle.crop((0, 0, radius, radius)), circle.crop((0, radius, radius, radius * 2))upperRight, lowerRight = circle.crop((radius, 0, radius * 2, radius)), circle.crop((radius, radius, radius * 2, radius * 2))alpha.paste(upperLeft, (0, 0))alpha.paste(upperRight, (w - radius, 0))alpha.paste(lowerRight, (w - radius, h - radius))alpha.paste(lowerLeft, (0, h - radius))img.putalpha(alpha)return img
我们仔细分析一下:
circle = Image.new('L', (radius * 2, radius * 2), 0)draw = ImageDraw.Draw(circle)draw.ellipse((0, 0, radius * 2, radius * 2), fill = 255)
↑ 创建一个 L
模式的全黑(透明度通道参数为 0
)图像,再用全透的圆形裁剪。得到一个 mask:
将这个 mask 输入 RGBA 模式图片的 A 通道,就可以得到圆形图片,这也是最常用的圆形处理 mask 方法。
w, h = img.sizealpha = Image.new('L', img.size, 255)upperLeft, lowerLeft = circle.crop((0, 0, radius, radius)), circle.crop((0, radius, radius, radius * 2))upperRight, lowerRight = circle.crop((radius, 0, radius * 2, radius)), circle.crop((radius, radius, radius * 2, radius * 2))alpha.paste(upperLeft, (0, 0))alpha.paste(upperRight, (w - radius, 0))alpha.paste(lowerRight, (w - radius, h - radius))alpha.paste(lowerLeft, (0, h - radius))img.putalpha(alpha)
↑ 之后又创建一个全透的图片,并把四个角用 mask 的 1/4 盖上,确实是一个圆滑矩形四角的好方法。
但最大的问题是对于 RGBA 图片来说,我们这个函数只考虑了 RGB ,根本没有考虑 A ,举个例子:
Image.new('RGBA', (100, 100), (0, 0, 0, 150))
我们创建一个 RGBA 大小 100 x 100 的图片,他是 RGB 黑色,而且 A 有 150
的值,这个值越大,越通透。
将此图片进行如上函数的四角圆滑处理的话,会变成一张全黑的图,为什么呢?
因为处理四角的函数只考虑了 RGB ,没有考虑 A !
我们的 mask 在 A 上的中央是 255
全通透,他破坏了我们的 150
不通透,得到了全黑的显示。
正确的函数应为:
def imageRadiusProcessing(img, centralA, radius = 30):"""处理图片四个圆角。:centralA: 中央区域的 A 通道值,当指定为 255 时全透,四角将使用 0 全不透"""circle = Image.new('L', (radius * 2, radius * 2), 0)draw = ImageDraw.Draw(circle)draw.ellipse((0, 0, radius * 2, radius * 2), fill = centralA)w, h = img.sizealpha = Image.new('L', img.size, centralA)upperLeft, lowerLeft = circle.crop((0, 0, radius, radius)), circle.crop((0, radius, radius, radius * 2))upperRight, lowerRight = circle.crop((radius, 0, radius * 2, radius)), circle.crop((radius, radius, radius * 2, radius * 2))alpha.paste(upperLeft, (0, 0))alpha.paste(upperRight, (w - radius, 0))alpha.paste(lowerRight, (w - radius, h - radius))alpha.paste(lowerLeft, (0, h - radius))img.putalpha(alpha)return img
这里的通透应该与原图 A 通道相同,否则会破坏 A 通道通透度。
这篇关于python图片四角圆角处理中的细节——图片变黑问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!