[实战]制做简单的公众号二维码关注图

本文大约 1933 字,阅读大约须要 6 分钟php

最近刚刚更换了公众号名字,而后天然就须要更换下文章末尾的二维码关注图,可是以前是经过 windows 自带的画图软件作的,可是以前弄的时候其实仍是比较麻烦的,因此我就想做为一名程序猿,固然要努力用代码解决这个问题。html

并且最近发现了一个新的图像处理方面的库--Wand,它是 ImageMagick 库的 Python 接口。因而,我就打算用这个库来实现简单的制做一个二维码关注图,主要是完成如下几个工做:python

  1. 制做一个白色的背景图;
  2. 将背景图和公众号二维码图合成;
  3. 添加文字获得最终的合成图

简介

Wand 是基于 ctypes 库的适用于 Python 的 ImageMagick 的封装库。git

相比其余对 ImageMagick 的封装库,Wand 有如下几个优点:github

  1. 符合 Python 习惯和现代化的接口
  2. 有好的文档
  3. 经过 ctypes 进行封装
  4. 能够采用 pip 安装

安装教程

在 ubuntu下,能够直接按照下列命令安装:ubuntu

$ apt-get install libmagickwand-dev
$ pip install Wand
复制代码

安装要求

对 Python 版本要求:windows

  • Python 2.6+
  • CPython 2.6+
  • CPython 3.2+ or higher
  • PyPy 1.5+ or higher

MagickWand librarybash

  • Debian/Ubuntu 系统:采用 apt-get 安装 libmagickwand-dev
  • Mac 系统:用 MacPorts/Homebrew 安装 imagemagick
  • CentOS 系统: 使用 yum 安装 ImageMagick-devel

Windows 注意事项

主要仍是参照第一篇文章来安装,而且主要是在 Windows 下安装,其中下载 ImageMagick 的时候,在下载地址中须要选择 6.9版本的 dll 的 exe 执行文件安装,而不能选择最新版本的 7.0+,不然在 Python 中调用的时候,会出现问题ImportError: MagickWand shared library not found.,缘由根据Python doesn't find MagickWand Libraries (despite correct location?)中的说法是微信

A few sources said that Image Magick 7.x is not compatible with magick Wand so make sure you're using 6.x. Additionally, "static" suffix versions do not work. The one that finally worked for me was "ImageMagick-6.9.8-10-Q8-x64-dll.exe"机器学习

也就是说 Image Magick 7.x 版本和 Wand 并不适配,因此只能采用 6+ 版本的。

实战

安装完成后,这里首先须要准备一张或者几张要合成的图片,好比做为背景的图片和前景图片,这里我是先给定大小来生成背景图片,而前景图片天然是个人公众号二维码图片了:

公众号二维码

首先是须要导入如下这些包:

from wand.image import Image
from wand.drawing import Drawing
from wand.color import Color
from wand.display import display
复制代码

1. 生成背景图片

生成背景图片的代码以下所示:

# 画一个纯白背景,并保存
def draw_bg(self, width, height, filename=None, color='white'):
    img = Image(width=width, height=height, background=Color(color))
    if filename is not None:
        img.save(filename=filename)

    return img
复制代码

这里就是根据传入的宽和高width,height,以及背景颜色color,生成指定大小和颜色的背景图片。

2. 将背景图和公众号二维码图合成

接着就是合成图片的函数代码:

# 合成图片
def composite_with_image(self, img_back, img, left, top, save_name=None, is_display=False):
  draw = Drawing()
  draw.composite(operator='atop',
                left=left, top=top,
                width=img.width,
                height=img.height,
                image=img)
  draw(img_back)
  if is_display:
  	display(img_back)
  if save_name is not None:
  	img_back.save(filename=save_name)
  return img_back
# 读取图片
def read_image(self, image_name):
  img = Image(filename=image_name)
  print('width=', img.width)
  print('height=', img.height)
  print('size=', img.size)
  return img, img.width, img.height
复制代码

首先是用read_image()函数读取待合成的图片,而后利用composite_with_image函数来合成输入的两张图片,其中img_back表示背景图片,而img就是前景图片,left, top分别是前景图片在背景图片的左上角坐标位置。

这一步获得的结果以下所示,这里我设置的背景图片大小为:

image_name = 'qrcode.jpg'
qrcode_img, width, height = read_image(images_name)
bg_width = int(width * 2.5)
bg_height = int(height * 1.1)
复制代码

二维码和背景合成图

3. 添加文字

最后一步就是添加文字了,前面两步其实都很是简单,直接调用接口便可,可是添加文字的时候,却出现问题了。是什么问题呢?

首先先给出wand添加文字的代码:

def draw_text(self, image, x, y, text, font_size=15, font_style='normal', text_alignment='left',text_color='Black', filename=None, is_display=False):
    draw = Drawing()
    draw.fill_color = Color(text_color)
    draw.font_size = font_size
    draw.font_style = font_style
    draw.text_alignment = text_alignment
    draw.text(x, y, text)
    draw(image)
    if is_display:
        display(image)
    if filename is not None:
        image.save(filename=filename)
    return image
复制代码

刚刚说的问题,其实也是 Python 很常见的问题,就是若是使用到中文的字符串的问题,原本我认为也是编码问题,可是我发现设置一个只包含英文字符串,和包含有中文字符串的结果是这样的:

代码以下所示:

text1 = 'Hello world'
text2 = 'wechat:机器学习与计算机视觉'
 x = int(width * 1.5) + 50
 margin = 60
y2 = int(bg_height // 2)
y1 = y2 - margin
x1 = x2 = x + 20

result1 = draw_text(composite_images, x1, y1, text1, font_size=20, text_color='Gray', 			 text_alignment='center', filename='qrcode_composition.jpg', is_display=False)
result2 = draw_text(result1, x2, y2, text2, font_size=30, text_color='Black',
                      text_alignment='center',filename='qrcode_composition.jpg',
                                             is_display=False)
复制代码

因此这应该不是编码问题,经过谷歌搜索后,发现应该是wand默认不支持中文字符的缘由,接着在看到参考文章4后,我发现能够经过wand.drawing.Drawing.font()接口导入支持中文的字体来解决这个问题,而这些字体在哪里能够找到呢,其实在c:\windows\fonts\目录下面就能够找到了,宋体、微软雅黑的字体,只要指定字体路径便可,所以更新后的代码以下:

FONT_DICT = {'宋体': 'songti.ttc',
             '微软雅黑1': 'msyh.ttc',
             '微软雅黑2': 'msyhbd.ttc',
             '微软雅黑3': 'msyhl.ttc'}
def draw_text(self, image, x, y, text, font_size=15, font_style='normal',font=None, text_alignment='left',text_color='Black', filename=None, is_display=False):
    draw = Drawing()
 	if font is not None:
        draw.font = font
    draw.fill_color = Color(text_color)
    draw.font_size = font_size
    draw.font_style = font_style
    draw.text_alignment = text_alignment
    draw.text(x, y, text)
    draw(image)
    if is_display:
        display(image)
    if filename is not None:
        image.save(filename=filename)
    return image
复制代码

最终合成的结果以下:

完整代码能够到个人Github上查看--image_composition

小结

此次的实战练习其实很是简单,惟一比较有困难的就是解决如何添加中文的文字了,可是仍是很是实用的,熟练学会这个Wand后,就能够本身合成各类图片了,而且添加文字或者是其余图形等,具体能够查阅官方文档。

本文参考文章:

  1. Wand--Installtion
  2. imagemagick home
  3. Wand Documentation
  4. 用ImageMagick在图片中写中文的问题及解决
  5. python-wand-change-text-style-with-draw-text

以上就是本文的主要内容和总结,欢迎留言给出你对本文的建议和见解。

同时也欢迎关注个人微信公众号--机器学习与计算机视觉或者扫描下方的二维码,和我分享你的建议和见解,指正文章中可能存在的错误,你们一块儿交流,学习和进步!

推荐阅读

1.机器学习入门系列(1)--机器学习概览(上)

2.机器学习入门系列(2)--机器学习概览(下)

3.[实战] 图片转素描图

相关文章
相关标签/搜索