使用 Wand 以预定义图案填充图像

Fill an image with pre-defined pattern with Wand

我有一张图片(像这样:mask) and two integers, which represents a final image width & height. According to Wand's documentation Open empty image:

with Image(width=200, height=100) as img:
    img.save(filename='200x100-transparent.png')

这将导致具有透明背景的空白图像。 现在,问题是:如何创建相同的空图像,但使用 mask 图像作为背景图案?

composite CLI 命令本身具有以下运算符:

-tile repeat composite operation across and down image

但是Wand怎么实现呢?

嗯,在查看 ImageMagick Composite source code 本身之后,很明显,Wand 驱动的解决方案应该如下所示:

with Image(width=x, height=y) as img:
    for x in xrange(0, img.width, crop_mask_path.width):
        for y in xrange(0, img.height, crop_mask_path.height):
            img.composite_channel('default_channels', crop_mask_path, 'over', x, y)
    img.save(filename='patterned_image.png')

在我看来构建标题迭代器 the best solution。然而,另一种 hackish 方法是调用 tile: 协议,并允许内部 ImageMagick 方法处理合成。您将失去 DIY 继承的控制权,但会在优化的 IM 系统上获得一些性能。

from wand.image import Image
from wand.api import library

with Image() as img:
   # Same as `-size 400x400' needed by tile: protocol.
   library.MagickSetOption(img.wand, 'size', '400x400')
   # Prefix filename with `tile:' protocol.
   img.read(filename='tile:rose.png')
   img.save(filename='tile_rose.png')