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

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

最近刚刚更换了公众号名字,然后自然就需要更换下文章末尾的二维码关注图,但是之前是通过 windows 自带的画图软件做的,但是之前弄的时候其实还是比较麻烦的,所以我就想作为一名程序猿,当然要努力用代码解决这个问题。

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

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

简介

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

相比其他对 ImageMagick 的封装库,Wand 有以下几个优势:

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

安装教程

在 ubuntu下,可以直接按照下列命令安装:

$ apt-get install libmagickwand-dev
$ pip install Wand

安装要求

对 Python 版本要求:

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

MagickWand library

  • 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_sizedraw.font_style = font_styledraw.text_alignment = text_alignmentdraw.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) + 50margin = 60
y2 = int(bg_height // 2)
y1 = y2 - margin
x1 = x2 = x + 20result1 = 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 = fontdraw.fill_color = Color(text_color)draw.font_size = font_sizedraw.font_style = font_styledraw.text_alignment = text_alignmentdraw.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.py

小结

这次的实战练习其实非常简单,唯一比较有困难的就是解决如何添加中文的文字了,但是还是非常实用的,熟练学会这个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.[实战] 图片转素描图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/408879.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux初始化进程ppid号,linux基础(十一)--系统初始化的简谈

我们在深入学习linux之前呢首先要了解其的引导加载过程,这样我们就可以在判断一些在系统初始化过程的出现问题的来源,并及时做出处理。这个过程大概分为【开机】——【BIOS】(CMOS)——【grub或者其他引导程序】——【kernel boot】(initrd文件)——【in…

Vim 快速入门

本文大约 5000 字, 阅读大约需要 10 分钟在 Linux 下最常使用的文本编辑器就是 vi 或者 vim 了,如果能很好掌握这个编辑器,非常有利于我们更好的在 Linux 下面进行编程开发。vim 和 viVim是从 vi 发展出来的一个文本编辑器。代码补完、编译及…

(转载)Qt中使用cout输出的方法

&#xff08;转载&#xff09;http://blog.sina.com.cn/s/blog_4f183d960100sdxf.html最近用QT写一个控制台程序&#xff0c;却不能将提示文本输出到屏幕。 cout<<"abcd"正常运行但是屏幕上却没有输出。 解决办法&#xff1a; 在qt的工程文件(.pro文件)中加入以…

Vim快速入门

本文大约 5000 字&#xff0c; 阅读大约需要 10 分钟 在 Linux 下最常使用的文本编辑器就是 vi 或者 vim 了&#xff0c;如果能很好掌握这个编辑器&#xff0c;非常有利于我们更好的在 Linux 下面进行编程开发。 vim 和 vi Vim是从 vi 发展出来的一个文本编辑器。代码补完、编…

linux内核 cpu_die,Linux内核Crash分析

结合上面的知识&#xff0c;看下当内核打印堆栈信息时&#xff0c;都打印了上面信息。下面的打印信息是工作中遇到的一种情况&#xff0c;打印了内核的堆栈信息&#xff0c;PC指针在dev_get_by_flags中&#xff0c;不能访问的内核虚地址为45685516&#xff0c;内核中一般可访问…

[GAN学习系列] 初识GAN

本文大约 3800 字&#xff0c;阅读大约需要 8 分钟 要说最近几年在深度学习领域最火的莫过于生成对抗网络&#xff0c;即 Generative Adversarial Networks(GANs)了。它是 Ian Goodfellow 在 2014 年发表的&#xff0c;也是这四年来出现的各种 GAN 的变种的开山鼻祖了&#xff…

[GAN学习系列] 初始GAN

本文大约 3800 字&#xff0c;阅读大约需要 8 分钟要说最近几年在深度学习领域最火的莫过于生成对抗网络&#xff0c;即 Generative Adversarial Networks(GANs)了。它是 Ian Goodfellow 在 2014 年发表的&#xff0c;也是这四年来出现的各种 GAN 的变种的开山鼻祖了&#xff0…

[资源分享] 吴恩达最新《机器学习训练秘籍》中文版可以免费下载了

本文大约 600 字&#xff0c; 阅读大约需要 2 分钟 吴恩达老师在上个月底宣布终于完成了他最新的书籍《Machine Learning Yearning》的最后几个章节&#xff1a; 而最近这本书也有了免费的完整中文版下载了&#xff0c;中文版的名称是《机器学习训练秘籍》&#xff0c;封面如下…

Android学习笔记44:JSON数据解析

JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;采用完全独立于语言的文本格式&#xff0c;为Web应用开发提供了一种理想的数据交换格式。 本文将主要介绍在Android开发中&#xff0c;如何在服务器端创建JSON数据&#xff0c;以…

[GAN学习系列2] GAN的起源

本文大约 5000 字&#xff0c;阅读大约需要 10 分钟 这是 GAN 学习系列的第二篇文章&#xff0c;这篇文章将开始介绍 GAN 的起源之作&#xff0c;鼻祖&#xff0c;也就是 Ian Goodfellow 在 2014 年发表在 ICLR 的论文–Generative Adversarial Networks”&#xff0c;当然由于…

[资源分享] Github上八千Star的深度学习500问教程

本文大约 600 字&#xff0c;阅读大约需要 2 分钟这周要分享的一个资源是来自 Github 上的已经有八千多 Star 的一个深度学习知识总结&#xff0c;如下图所示&#xff1a;其 Github 地址为&#xff1a;https://github.com/scutan90/DeepLearning-500-questions它目前是有 16 个…

谷歌开源的 GAN 库--TFGAN

本文大约 8000 字&#xff0c;阅读大约需要 12 分钟 第一次翻译&#xff0c;限于英语水平&#xff0c;可能不少地方翻译不准确&#xff0c;请见谅&#xff01; 最近谷歌开源了一个基于 TensorFlow 的库–TFGAN&#xff0c;方便开发者快速上手 GAN 的训练&#xff0c;其 Github …