使用PIL使用“光照效果”复制ImageMagicks的徽章

时间:2012-07-26 23:35:52

标签: python imagemagick thumbnails python-imaging-library

ImageMagick有一种很酷的技术,即将图像“包裹”在灰度'遮罩'上。它为缩略图创建了一个很酷的按钮效果。我想帮助将我用ImageMagick看到的方法转换为PIL。 我不想对ImageMagick使用任何包装器。我需要在PIL中重新创建它。我不想使用传统的面具。 PIL是否有足够的能力重现这种影响?

ImageMagick中的原文: http://www.imagemagick.org/Usage/thumbnails/#badge_lighting

我非常熟悉基本的ImageMagick和PIL,比如缩放和线条绘制,但这个例子是在复杂方面。有没有PIL专家能够协助?

ImageMagick来源

# merge "mask 'n' paint" images with a gray image,
# to create a "lighting mask"
convert -size 90x90 xc:gray50 -alpha set \
      badge_mask.png -compose DstIn -composite \
      badge_shading.png -compose Over -composite \
      badge_lighting.png

# Apply the single "lighting mask"
convert thumbnail.gif -alpha set -gravity center -extent 90x90 \
      badge_lighting.png \
      \( -clone 0,1 -alpha Opaque -compose Hardlight -composite \) \
      -delete 0 -compose In -composite \
      badge_final.png

输入RGB imageA(可能是jpg)

输入RGBA imageB(png文件 - 灰度或通道将转换为)

输出RGBA resultimage(png文件)

1 个答案:

答案 0 :(得分:1)

这可能不是imagemagick所做的,但结果非常相似。 我使用函数(transparent_when_gray)转换徽章模板像素值来创建alpha蒙版,对于127(徽章模板的“基本”颜色)完全透明,并且当值变大或变小时更加不透明。 然后我使用这个alpha-mask合成徽章模板和源图像。

import Image, ImageChops, ImageOps

def transparent_when_gray(x):
    return 255 if x == 127 else 255 - 2 * abs(127 - x)

def mk_badge(img, template):
    templ = template.convert('RGBA')
    r, g, b, alpha = templ.split()
    gray = ImageOps.grayscale(Image.merge('RGB', (r, g, b)))
    amask = gray.point(transparent_when_gray)

    res = ImageChops.composite(img, templ, amask)
    res.putalpha(alpha)
    return res

if __name__ == '__main__':
    image    = Image.open('thumbnail.gif')
    template = Image.open('badge_lighting.png')

    image_cropped = ImageOps.fit(image, template.size)

    badge = mk_badge(image_cropped, template)
    badge.save('badge.png')