「连载十五」生成二维码、合并海报
知识点
- 图片生成
- 二维码生成
本文目标
在文章的详情页中,我们常常会需要去宣传它,而目前最常见的就是发海报了,今天我们将实现如下功能:
-
生成二维码
-
合并海报(背景图 + 二维码)
实现
首先,你需要在 App 配置项中增加二维码及其海报的存储路径,我们约定配置项名称为 QrCodeSavePath,值为 qrcode/,经过多节连载的你应该能够完成,若有不懂可参照 go-gin-example。
生成二维码
安装
$ go get -u github.com/boombuler/barcode
工具包
考虑生成二维码这一动作贴合工具包的定义,且有公用的可能性,新建 pkg/qrcode/qrcode.go 文件,写入内容:
|
|
这里主要聚焦 func (q *QrCode) Encode 方法,做了如下事情:
- 获取二维码生成路径
- 创建二维码
- 缩放二维码到指定大小
- 新建存放二维码图片的文件
- 将图像(二维码)以 JPEG 4:2:0 基线格式写入文件
另外在 jpeg.Encode(f, code, nil) 中,第三个参数可设置其图像质量,默认值为 75
|
|
路由方法
1、第一步
在 routers/api/v1/article.go 新增 GenerateArticlePoster 方法用于接口开发
2、第二步
在 routers/router.go 的 apiv1 中新增 apiv1.POST("/articles/poster/generate", v1.GenerateArticlePoster) 路由
3、第三步
修改 GenerateArticlePoster 方法,编写对应的生成逻辑,如下:
|
|
验证
通过 POST 方法访问 http://127.0.0.1:8000/api/v1/articles/poster/generate?token=$token(注意 $token)
通过检查两个点确定功能是否正常,如下:
1、访问结果是否 200
2、本地目录是否成功生成二维码图片
合并海报
在这一节,将实现二维码图片与背景图合并成新的一张图,可用于常见的宣传海报等业务场景
背景图
将背景图另存为 runtime/qrcode/bg.jpg(实际应用,可存在 OSS 或其他地方)
service 方法
打开 service/article_service 目录,新建 article_poster.go 文件,写入内容:
|
|
这里重点留意 func (a *ArticlePosterBg) Generate() 方法,做了如下事情:
- 获取二维码存储路径
- 生成二维码图像
- 检查合并后图像(指的是存放合并后的海报)是否存在
- 若不存在,则生成待合并的图像 mergedF
- 打开事先存放的背景图 bgF
- 打开生成的二维码图像 qrF
- 解码 bgF 和 qrF 返回 image.Image
- 创建一个新的 RGBA 图像
- 在 RGBA 图像上绘制 背景图(bgF)
- 在已绘制背景图的 RGBA 图像上,在指定 Point 上绘制二维码图像(qrF)
- 将绘制好的 RGBA 图像以 JPEG 4:2:0 基线格式写入合并后的图像文件(mergedF)
错误码
路由方法
打开 routers/api/v1/article.go 文件,修改 GenerateArticlePoster 方法,编写最终的业务逻辑(含生成二维码及合并海报),如下:
|
|
这块涉及到大量知识,强烈建议阅读下,如下:
其所涉及、关联的库都建议研究一下
StaticFS
在 routers/router.go 文件,增加如下代码:
|
|
验证
访问完整的 URL 路径,返回合成后的海报并扫除二维码成功则正确 🤓
总结
在本章节实现了两个很常见的业务功能,分别是生成二维码和合并海报。希望你能够仔细阅读我给出的链接,这块的知识量不少,想要用好图像处理的功能,必须理解对应的思路,举一反三
最后希望对你有所帮助 👌
- 原文作者:知识铺
- 原文链接:https://index.zshipu.com/go/posts/go/gin/2018-07-05-image/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。
- 免责声明:本页面内容均来源于站内编辑发布,部分信息来源互联网,并不意味着本站赞同其观点或者证实其内容的真实性,如涉及版权等问题,请立即联系客服进行更改或删除,保证您的合法权益。转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。也可以邮件至 sblig@126.com