使用 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')
我有一张图片(像这样: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')