使用python和imagemagick

时间:2018-03-27 16:58:43

标签: python imagemagick wand bytesio

对于python的imagemagick,大多数人推荐“魔杖”但是如何在python中使用它来附加图像?我想在python:http://www.imagemagick.org/Usage/annotating/中使用imagemagick在图像底部添加标签,但是wand api似乎非常基本,并且没有很多imgemagick命令,包括标签和追加。

在python中有没有其他方法可以使用imagemagick?我的图像是png类型,并且是python代码中的BytesIO流而不是文件,所以我不能使用命令行将它们传递给imagemagick,也不能将它们保存在任何临时文件中。

2 个答案:

答案 0 :(得分:2)

我不确定你要求的是什么,但我猜你想写一个标签"低于"一个图像。以下是库的示例。

from wand.image import Image
from wand.compat import nested
from wand.color import Color
from wand.font import Font

with nested(Image(filename='logo:'),
            Image(filename='null:')) as (source, text):
    text.font = Font('Impact', 64)
    text.read(filename='label:Hello world!')
    largest_width = max(source.width, text.width)
    offset = (largest_width - min(source.width, text.width)) / 2
    with Image(width=largest_width,
               height=source.height + text.height,
               background=Color('WHITE')) as dst:
        dst.composite(source, 0, 0)
        dst.composite(text, int(offset), source.height)
        dst.save(filename="output.png")

Hello World

<强>概述

with nested(Image(filename='logo:'),
            Image(filename='null:')) as (source, text):

创建两个图像。您将负责使用ByteIO缓冲区替换logo:图像。 null:图像是用于分配魔杖实例的占位符。

    text.font = Font('Impact', 64)
    text.read(filename='label:Hello world!')

这定义了字体&amp;要绘制的文字。 label:协议可以替换为caption:以获得其他行为(s?)。

    with Image(width=largest_width,
               height=source.height + text.height,
               background=Color('WHITE')) as dst:

创建第三个&#34;空白&#34;图像足够大,可以包含两个图像。

        dst.composite(source, 0, 0)
        dst.composite(text, int(offset), source.height)

复制source&amp;的图像数据。 text新图片。

答案 1 :(得分:0)

Imagemagick很棒,但学习曲线陡峭。您需要安装第三方ImageMagick(根据您的python版本,必须是32位或64位)。考虑到需要将其添加到路径并且运行脚本需要可执行文件,单独安装是一件痛苦的事。

考虑一些更便携的东西,包含像Pillow这样的东西,它有许多功能可以实现你的目标。

pip install pillow

在枕头中,您可以阅读BytesIO的图像。并在它们上绘制或打印。有多种选择。

from PIL import Image, ImageDraw
import io


# Reading bytes from file but you can skip that and simply open your bytes like below.

with open('picture.jpg', 'rb') as f:
    im = Image.open(io.BytesIO(f.read()))
    draw = ImageDraw.Draw(im)
    draw.text((10,10), "Hello World", fill=(255))
    im.show() # do whatever you like with the image

查看文档以获取更多示例。 https://pillow.readthedocs.io/en/latest/