最近需要为用户服务添加一些新功能,其中就包括在注册时根据用户昵称生成头像这一点。

由于用户服务是用golang写的,google来google去都只找到freetype一个比较简单好用的库,其他比如ImageMagicK之类api都过于低层不适合我们这样相对简单的图片生成需求。

那说干就干,在go freetype仓库里找了个 example 就开始撸。

首先将又长又臭的这个example重新组织为几个函数,再按照我的需求修改一些参数……(想知道重构后的代码时什么样的话,请直接下拉,查看我封装的类库仓库地址。)

撸了一下午之后得到了我想要的结果,先贴两张图给大伙瞧瞧。

(数字)

(英文)

(汉字)

由于这个小功能挺有意思,觉得以后会用到所以把它稍微封装了一下放到了仓库里——AvatarBuilder,点我访问

用法


首先安装:

go get -u github.com/ShiningRush/avatarbuilder

 

然后使用,代码片段如下(golang):

    // init avatarbuilder, you need to tell builder ttf file and how to alignment text
ab := avatarbuilder.NewAvatarBuilder("./SourceHanSansSC-Medium.ttf", &calc.SourceHansSansSCMedium{})
ab.SetBackgroundColorHex(colors[])
ab.SetFrontgroundColor(color.White)
ab.SetFontSize()
ab.SetAvatarSize(, )
if err := ab.GenerateImageAndSave("", "./out.png"); err != nil {
fmt.Println(err)
return
}

完整的例子可以在仓库的example里看到:点击查看

你可以按照你的需求设置头像的宽高以及字体大小和字体文件,需要注意的是,目前该库只实现了一个免费开源的字体文件——思源。

因为每个字体文件的宽高都有点差异,所以当你引入新的字体时也需要拓展一个新的算法来告诉如何生成居中的文字。

可以参考 calc 文件夹下的实现。

以上,希望对以后有相同需求的同学有帮助。

(很遗憾,最近在写go和python比较多,所以没有c#的实现版本,幸运的是,c#在图形处理方面的库本就不少,资料很全完全不用操心。)

教你用go freetype根据用户昵称生成头像的更多相关文章

  1. 微信小程序 获取用户昵称、头像

    前段时间微信小程序对获取用户昵称和头像方法进行了更新,网上很多的文章都已经不适用了,这里简单总结一下,首先,传统接口wx.getUserInfo的效果会弹出一个给用户的弹窗,需要用户授权,经过测试传统 ...

  2. mysql保存emoji表情(微信开发用户昵称..)

      java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x94' for colum n 'name' at row 1 at c ...

  3. 随机生成游戏用户昵称(nodejs版本)(含机器人头像,金币等)

    1 前言 有时需要生成随机的用户(或机器人)昵称,头像,金币等,但又不想太生硬,可以现在网上爬一些常见昵称到文本中,然后读取出来,随机使用即可. 2 代码 var nickNameArr = []; ...

  4. mysql 微信用户昵称emoji 完整保存

    微信用户昵称现在丰富多样,一些个性的名称中经常包含有特殊字符,以及emoji表情.起先,我总以为MySQL只能保存纯文本数据.但其实mysql(5.7版本)已非常强大,完整保存微信用户昵称(emoji ...

  5. wechat4j获取用户昵称乱码修复

    项目对接微信公众号平台时,微信的官方给出的建议是使用wechat4j.官方建议的,自然心里踏实,但实际用起来时发现wechat4j埋有很多雷,最让人心烦意乱的就是中文乱码问题. 之前写过一篇为JAXB ...

  6. 微信开放接口获取用户昵称保存到MySQL中为空白

    微信昵称中包含emoji表情标签,某些标签是使用了4字节编码的UTF8. 而大多数MySQL数据库现在使用的是3字节UTF8编码,这样会导致保存为空,且不会提示失败. 解决方法有2个,一个是升级到My ...

  7. 04: Form 验证用户数据 & 生成html

    目录:Django其他篇 01:Django基础篇 02:Django进阶篇 03:Django数据库操作--->Model 04: Form 验证用户数据 & 生成html 05:Mo ...

  8. 如何给Docker hub用户上传头像

    我第一次使用Docker hub时,觉得很奇怪,这个网站上面没有允许用户上传头像的地方. 后来经过研究才发现,需要用在Docker hub上注册用户的同一个邮箱到Gravatar这个网站上再注册一个账 ...

  9. 根据用户id生成一个唯一邀请码

    需求描述:根据用户id生成与之对应的唯一邀请码,范围为‘0-9A-Z’. 这个需求的重点在于加粗的部分,也就是要能够根据邀请码反推出用户ID,这样邀请码就不用入库了,在用户量很大的情况下,性能可以得到 ...

随机推荐

  1. Delphi XE7实现的任意位置弹出菜单

    Delphi XE7中目前还没有弹出菜单组件,这个弹出菜单应用很普遍,在JAVA开发的安卓程序中很简单就可以用上了,应该说是一个标准控件.看了一些例子,但是都不能满足我想在任意位置弹出菜单需求,于是自 ...

  2. 微信小程序如何转换成分与秒

  3. “全栈2019”Java多线程第五章:线程睡眠sleep()方法详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  4. java简单正则验证手机号

    import java.util.regex.Matcher; import java.util.regex.Pattern; /** * @Title:Tadesfza * @Description ...

  5. 微信小程序ofo小黄车+thinkphp5.0打造全栈应用

    原文地址:https://www.imooc.com/article/20310 ofo至今还没有微信小程序(很费解),每次用ofo都得去支付宝,很不方便,我用微信用的比较多,无意间在简书上面看到某人 ...

  6. (转)使用VS实现XML2CS

    转自 StackOverFlow Method 1 XSD tool Suppose that you have your XML file in this location C:\path\to\x ...

  7. Myeclipse设置自动联想功能

    ///声明,博客园暂无转载功能,这篇博客是转载自贞心真义. 最近初学Java,正在使用MyEclipse来编写新的项目,刚开始打开MyEclipse感觉这个工具既陌生又熟悉,熟悉之处在于编辑器的几大共 ...

  8. 获取指定订阅下所有Azure ARM虚拟机配置(CPU核数,内存大小,磁盘信息)的使用情况

    脚本内容: <# .SYNOPSIS This script grab all ARM VM VHD file in the subscription and caculate VHD size ...

  9. leetcode-840-Magic Squares In Grid

    题目描述: A 3 x 3 magic square is a 3 x 3 grid filled with distinct numbers from 1 to 9 such that each r ...

  10. POJ 2239

    #include<iostream> #include<algorithm> #define MAXN 305 using namespace std; int _m[MAXN ...