带文字的水印图像

时间:2020-08-26 12:13:52

标签: python matplotlib

我正在尝试在地块上添加水印图像,例如在this答案中做了类似的操作,但也在水印图像的底部添加了一些文本。

我不能只是将文本作为图像的一部分,因为文本会不时变化。

img = mpimg.imread('/path/to/image.png')
imagebox = OffsetImage(img, alpha=0.5)
ao = AnchoredOffsetbox('lower left', pad=0, borderpad=1, child=imagebox)        
ax.add_artist(ao)

无法将另一个Artist添加到AnchoredOffsetbox,因为其中只能有一个single child

有什么方法可以向该图像添加文本,还是可以使用另一个容器?<​​/ p>

谢谢!

2 个答案:

答案 0 :(得分:1)

in the documentation所述,如果您希望AnchoredOffsetbox中有多个孩子,则可以选择使用容器盒(VPackerHPacker):

当需要多个子代时,请使用其他OffsetBox类将它们括起来。

import matplotlib.pyplot as plt
from matplotlib.offsetbox import (OffsetImage, TextArea, AnchoredOffsetbox, VPacker)


def create_watermark(imagePath, label, ax=None, alpha=0.5):
    if ax is None:
        ax = plt.gca()

    img = plt.imread(imagePath)
    imagebox = OffsetImage(img, alpha=alpha, zoom=0.2)
    textbox = TextArea(label, textprops=dict(alpha=alpha))
    packer = VPacker(children=[imagebox, textbox], mode='fixed', pad=0, sep=0, align='center')
    ao = AnchoredOffsetbox('lower left', pad=0, borderpad=1, child=packer)
    ax.add_artist(ao)


if __name__ == '__main__':
    fig, ax0 = plt.subplots()
    create_watermark('../lena.png', 'WATERMARK', ax=ax0)
    plt.show()

enter image description here

答案 1 :(得分:0)

仅使用plt.text(x, y, s)就足够了。 x是x轴的坐标,而y是y轴的坐标。 s是您要写入情节的字符串。

from PIL import Image
import matplotlib.pyplot as plt
from matplotlib.offsetbox import ( OffsetImage,AnchoredOffsetbox)


def watermark2(ax):
    img = Image.open('stinkbug.png')
    width, height = ax.figure.get_size_inches()*fig.dpi
    wm_width = int(width/4) # make the watermark 1/4 of the figure size
    scaling = (wm_width / float(img.size[0]))
    wm_height = int(float(img.size[1])*float(scaling))
    img = img.resize((wm_width, wm_height), Image.ANTIALIAS)

    imagebox = OffsetImage(img, zoom=1, alpha=0.2)
    imagebox.image.axes = ax

    ao = AnchoredOffsetbox(4, pad=0.01, borderpad=0, child=imagebox)
    ao.patch.set_alpha(0)
    ax.add_artist(ao)

fig, ax = plt.subplots()
ax.plot([1,2,3,4], [1,3,4.5,5])

watermark2(ax)

plt.text(3.7, 1.0, "text example")

ax.set_xlabel("some xlabel")
plt.show()

enter image description here