12

我有一个方形徽标,我需要对其进行圆角处理,搜索了一段时间并获得了以下代码“工作”:

def round_corner_jpg(image, radius):
    """generate round corner for image"""
    mask = Image.new('RGB', image.size)
    #mask = Image.new('RGB', (image.size[0] - radius, image.size[1] - radius))
    #mask = Image.new('L', image.size, 255)
    draw = aggdraw.Draw(mask)
    brush = aggdraw.Brush('black')
    width, height = mask.size
    draw.rectangle((0,0,width,height), aggdraw.Brush('white'))
    #upper-left corner
    draw.pieslice((0,0,radius*2, radius*2), 90, 180, None, brush)
    #upper-right corner
    draw.pieslice((width - radius*2, 0, width, radius*2), 0, 90, None, brush)
    #bottom-left corner
    draw.pieslice((0, height - radius * 2, radius*2, height),180, 270, None, brush)
    #bottom-right corner
    draw.pieslice((width - radius * 2, height - radius * 2, width, height), 270, 360, None, brush)
    #center rectangle
    draw.rectangle((radius, radius, width - radius, height - radius), brush)
    #four edge rectangle
    draw.rectangle((radius, 0, width - radius, radius), brush)
    draw.rectangle((0, radius, radius, height-radius), brush)
    draw.rectangle((radius, height-radius, width-radius, height), brush)
    draw.rectangle((width-radius, radius, width, height-radius), brush)
    draw.flush()
    del draw
    return ImageChops.add(mask, image)

然后我保存了返回的图像对象,但是 像这样在角落里有白色背景 我怎样才能摆脱白色背景或让它不可见?先谢谢了~

编辑:这是 fraxel 的代码,谢谢~

def add_corners(im, rad):
    circle = Image.new('L', (rad * 2, rad * 2), 0)
    draw = ImageDraw.Draw(circle)
    draw.ellipse((0, 0, rad * 2, rad * 2), fill=255)
    alpha = Image.new('L', im.size, "white")
    w, h = im.size
    alpha.paste(circle.crop((0, 0, rad, rad)), (0, 0))
    alpha.paste(circle.crop((0, rad, rad, rad * 2)), (0, h - rad))
    alpha.paste(circle.crop((rad, 0, rad * 2, rad)), (w - rad, 0))
    alpha.paste(circle.crop((rad, rad, rad * 2, rad * 2)), (w - rad, h - rad))
    im.putalpha(alpha)
    return im


if __name__ == '__main__':
    im = Image.open('1.jpg')
    im = add_corners(im, 100)
    im.save('out.png')`

很抱歉..我需要图像形状是椭圆而不是矩形,即从图片上写下东西,@fraxel,我仍然可以看到你为我处理的图片中的白色角落

4

2 回答 2

29

首先,确保以支持透明度的格式保存图像。PNG会,JPG不会...下面是一些非常不错的代码,可以添加透明角。它是这样工作的:

  1. 绘制一个半径为 , 的圆rad,使用draw.ellipse()
  2. 为 Alpha 通道创建与图像大小相同的图像
  3. 将我们的圆圈切成四块(圆角),并将它们放在 alpha 图像的正确角落
  4. 使用将 alpha 通道放入图像中putalpha()
  5. 另存为png,从而保持透明度。

这是代码:

import Image, ImageDraw

def add_corners(im, rad):
    circle = Image.new('L', (rad * 2, rad * 2), 0)
    draw = ImageDraw.Draw(circle)
    draw.ellipse((0, 0, rad * 2, rad * 2), fill=255)
    alpha = Image.new('L', im.size, 255)
    w, h = im.size
    alpha.paste(circle.crop((0, 0, rad, rad)), (0, 0))
    alpha.paste(circle.crop((0, rad, rad, rad * 2)), (0, h - rad))
    alpha.paste(circle.crop((rad, 0, rad * 2, rad)), (w - rad, 0))
    alpha.paste(circle.crop((rad, rad, rad * 2, rad * 2)), (w - rad, h - rad))
    im.putalpha(alpha)
    return im

im = Image.open('tiger.jpg')
im = add_corners(im, 100)
im.save('tiger.png')

弯边虎示例:

在此处输入图像描述

这是您的图像,使用此代码处理,提供透明角:

在此处输入图像描述

于 2012-07-02T09:58:50.987 回答
1

您是否尝试过image.putalpha(mask)用蒙版替换图像的 Alpha 通道?这似乎应该做你想做的事。mask可能必须处于“L”模式才能正常工作,并且image应该可能是“RGBA”,但可能会自动为您转换。

这里的最佳答案提供了一些很好的例子: 如何使用 PIL 生成圆形缩略图?

您的蒙版图像看起来不错,但我认为您想交换“白色”和“黑色”,因此您有一个白色圆角矩形,正是您希望最终图像的形状,在黑色背景上。您可能还需要使用“L”模式(灰度)模式。

获得此图像后,您可以替换return ImageChops.add(mask, image)by image.putalpha(mask); return image,这应该会导致图像仅在蒙版的黑色区域中是透明的。

您可能需要先转换图像,image.convert('RGBA')但我认为这在 PIL 的更高版本中是不必要的,它会自动完成。

类似的东西:(抱歉现在无法测试)

def round_corner_jpg(图像,半径):
    """为图像生成圆角"""
    mask = Image.new('L', image.size) # 默认填充黑色
    绘制 = aggdraw.Draw(蒙版)
    刷 = aggdraw.Brush('白色')
    宽度,高度 = mask.size
    #左上角
    draw.pieslice((0,0,radius*2, radius*2), 90, 180, None, Brush)
    #右上角
    draw.pieslice((宽度 - 半径*2, 0, 宽度, 半径*2), 0, 90, 无, 刷子)
    #左下角
    draw.pieslice((0, 高度 - 半径 * 2, 半径*2, 高度),180, 270, 无, 刷子)
    #右下角
    draw.pieslice((宽度 - 半径 * 2, 高度 - 半径 * 2, 宽度, 高度), 270, 360, 无, 刷子)
    #中心矩形
    draw.rectangle((半径,半径,宽度 - 半径,高度 - 半径),画笔)
    #四边矩形
    draw.rectangle((半径,0,宽度 - 半径,半径),画笔)
    draw.rectangle((0, 半径, 半径, 高度-半径), 画笔)
    draw.rectangle((半径,高度半径,宽度半径,高度),画笔)
    draw.rectangle((宽度-半径,半径,宽度,高度-半径),画笔)
    draw.flush()
    图像 = image.convert('RGBA')
    image.putalpha(掩码)
    返回图片
于 2012-07-02T03:57:13.983 回答