• Python给图片打水印-Watermark With Pil

    by{ guangboo }, published {2009-08-03}, Tag { Python / PIL / }

    Python使用PIL来给图片打水印。支持彩色,瓦工,缩放,和不透明性

    import Image, ImageEnhance
    
    def reduce_opacity(im, opacity):
        """Returns an image with reduced opacity."""
        assert opacity >= 0 and opacity <= 1
        if im.mode != 'RGBA':
            im = im.convert('RGBA')
        else:
            im = im.copy()
        alpha = im.split()[3]
        alpha = ImageEnhance.Brightness(alpha).enhance(opacity)
        im.putalpha(alpha)
        return im
    
    def watermark(im, mark, position, opacity=1):
        """Adds a watermark to an image."""
        if opacity < 1:
            mark = reduce_opacity(mark, opacity)
        if im.mode != 'RGBA':
            im = im.convert('RGBA')
        # create a transparent layer the size of the image and draw the
        # watermark in that layer.
        layer = Image.new('RGBA', im.size, (0,0,0,0))
        if position == 'tile':
            for y in range(0, im.size[1], mark.size[1]):
                for x in range(0, im.size[0], mark.size[0]):
                    layer.paste(mark, (x, y))
        elif position == 'scale':
            # scale, but preserve the aspect ratio
            ratio = min(
                float(im.size[0]) / mark.size[0], float(im.size[1]) / mark.size[1])
            w = int(mark.size[0] * ratio)
            h = int(mark.size[1] * ratio)
            mark = mark.resize((w, h))
            layer.paste(mark, ((im.size[0] - w) / 2, (im.size[1] - h) / 2))
        else:
            layer.paste(mark, position)
        # composite the watermark with the layer
        return Image.composite(layer, im, layer)
    
    def test():
        im = Image.open('test.png')
        mark = Image.open('overlay.png')
        watermark(im, mark, 'tile', 0.5).show()
        watermark(im, mark, 'scale', 1.0).show()
        watermark(im, mark, (100, 100), 0.5).show()
    
    if __name__ == '__main__':
        test()
    

    使用该加水印的功能,将水印添加到图片上,这个图片和水印都必须是PIL图像,布局可以是(x,y),tile,或者是“scale”,透明度是0-1的数值;值越小水印越透明。水印功能使用reduce_opacity函数,但是如果你是水印打在多个图片上,你可以使用reduce_opacity来优化水印。

    代码要求PIL 1.1.4,运行很快,但如果操作大图片恐怕会消耗大量内存。