零:背景

这是我工作中实际碰到的后端生成图片拼接和文字贴图需求。特此总结下来,方便后人。文中代码都是我们生产环境使用的。

一:图片拼接

go标准库的image包本身就能实现拼接,因此还是比较简单的

直接上代码

1.1 图片拼接代码

//图片拼接
func MergeImageNew(base image.Image, mask image.Image, paddingX int, paddingY int) (*image.RGBA, error) {baseSrcBounds := base.Bounds().MaxmaskSrcBounds := mask.Bounds().MaxnewWidth := baseSrcBounds.XnewHeight := baseSrcBounds.YmaskWidth := maskSrcBounds.XmaskHeight := maskSrcBounds.Ydes := image.NewRGBA(image.Rect(0, 0, newWidth, newHeight)) // 底板//首先将一个图片信息存入jpgdraw.Draw(des, des.Bounds(), base, base.Bounds().Min, draw.Over)//将另外一张图片信息存入jpgdraw.Draw(des, image.Rect(paddingX, newHeight-paddingY-maskHeight, (paddingX+maskWidth), (newHeight-paddingY)), mask, image.ZP, draw.Over)return des, nil
}

核心就是使用image>newRGBA新建一个空白底图,让后将背景图,拼接图使用draw.Draw画上去就好了。

1.2 从本地、网络读取图片

从本地读取

func GetImageFromFile(filePath string) (img image.Image, err error) {f1Src, err := os.Open(filePath)if err != nil {return nil, err}defer f1Src.Close()buff := make([]byte, 512) // why 512 bytes ? see http://golang.org/pkg/net/http/#DetectContentType_, err = f1Src.Read(buff)if err != nil {return nil, err}filetype := http.DetectContentType(buff)fmt.Println(filetype)fSrc, err := os.Open(filePath)defer fSrc.Close()switch filetype {case "image/jpeg", "image/jpg":img, err = jpeg.Decode(fSrc)if err != nil {fmt.Println("jpeg error")return nil, err}case "image/gif":img, err = gif.Decode(fSrc)if err != nil {return nil, err}case "image/png":img, err = png.Decode(fSrc)if err != nil {return nil, err}default:return nil, err}return img, nil
}

从网络中读取

func GetImageFromNet(url string) (image.Image, error) {res, err := http.Get(url)if err != nil || res.StatusCode != 200 {return nil, err}defer res.Body.Close()m, _, err := image.Decode(res.Body)return m, err
}

保存图片

func SaveImage(targetPath string, m image.Image) error {fSave, err := os.Create(targetPath)if err != nil {return err}defer fSave.Close()err = jpeg.Encode(fSave, m, nil)if err != nil {return err}return nil
}

二:文字书写

图片书写文字是基于 github.com/golang/freetype 这个库实现的

import ("github.com/golang/freetype""github.com/golang/freetype/truetype""golang.org/x/image/font""image""io/ioutil"
)//字体相关
type TextBrush struct {FontType  *truetype.FontFontSize  float64FontColor *image.UniformTextWidth int
}func NewTextBrush(FontFilePath string, FontSize float64, FontColor *image.Uniform, textWidth int) (*TextBrush, error) {fontFile, err := ioutil.ReadFile(FontFilePath)if err != nil {return nil, err}fontType, err := truetype.Parse(fontFile)if err != nil {return nil, err}if textWidth <= 0 {textWidth = 20}return &TextBrush{FontType: fontType, FontSize: FontSize, FontColor: FontColor, TextWidth: textWidth}, nil
}// 图片插入文字
func (fb *TextBrush) DrawFontOnRGBA(rgba *image.RGBA, pt image.Point, content string) {c := freetype.NewContext()c.SetDPI(72)c.SetFont(fb.FontType)c.SetHinting(font.HintingFull)c.SetFontSize(fb.FontSize)c.SetClip(rgba.Bounds())c.SetDst(rgba)c.SetSrc(fb.FontColor)c.DrawString(content, freetype.Pt(pt.X, pt.Y))}func Image2RGBA(img image.Image) *image.RGBA {baseSrcBounds := img.Bounds().MaxnewWidth := baseSrcBounds.XnewHeight := baseSrcBounds.Ydes := image.NewRGBA(image.Rect(0, 0, newWidth, newHeight)) // 底板//首先将一个图片信息存入jpgdraw.Draw(des, des.Bounds(), img, img.Bounds().Min, draw.Over)return des
}

使用example

func TestTextBrush_DrawFontOnRGBA(t *testing.T) {textBrush, err := NewTextBrush("字体库ttf位置", 20, image.Black, 20)if err != nil {t.Log(err)}backgroud, err := GetImageFromFile("./resource/backgroud.jpg")if err != nil {t.Log(err)}des := Image2RGBA(backgroud)textBrush.DrawFontOnRGBA(des, image.Pt(10, 50), "世界你好")//调整颜色textBrush.FontColor = image.NewUniform(color.RGBA{R: 0x8E,G: 0xE5,B: 0xEE,A: 255,})textBrush.DrawFontOnRGBA(des, image.Pt(10, 80), "我是用Go拼上的文字")if err := SaveImage("./resource/text.png", des); err != nil {t.Log(err)}
}

先使用NewTextBrush第一个参数是字体库文件位置。这里使用的ttf格式的字体库,网上应该有免费的字体库。

参考我的example中的代码就可以直接使用。

希望能帮到各位读者。

go如何实现图片拼接,文字书写相关推荐

  1. Pr教程之如何制作文字书写效果

    制作文字书写效果   短视频盛行的时代,经常看见一些视频中的一些文字有书写的效果,于是,博主便百度了一些教程,学会了该效果的制作.本篇教程中只介绍基本的制作方法. 步骤一 1.新建或打开Pr工程 2. ...

  2. android图片编辑加文字,图片编辑加字下载-图片编辑加字 安卓版v3.9.0.0406-PC6安卓网...

    图片编辑加字app是一款手机图片编辑加字软件.图片编辑加字软件支持给图片添加各种样式的文字,自由排版,还能制作长图,非常实用. 软件介绍 图片编辑加字app是一款功能强大的多图片添加文字软件.可以添加 ...

  3. 什么是分镜头剧本?(分镜头剧本是将文字转换成立体视听形象的中间媒介。主要任务是根据解说词和电视文学脚本来设计相应画面,配置音乐音响,把握片子的节奏和风格等。)

    分镜头剧本是将文字转换成立体视听形象的中间媒介.主要任务是根据解说词和电视文学脚本来设计相应画面,配置音乐音响,把握片子的节奏和风格等. 剧本为拍摄电影奠定了基础,但它还不能直接用来进行拍摄,导演还要 ...

  4. 像个字段相减绝对值_遇见你丨像个英雄一样活着 瘫痪作家用手指敲击文字著百万字文学作品...

    患有先天性肌迟缓症,出生后便全身瘫痪,这样一个原本生活里充满艰难的人,他的名字却出现在了中国作家协会的2020年新会员名单中,他叫高淳. 今年36岁的高淳,家住江苏常熟,从2002年开始文学创作,凭着 ...

  5. 成都专业语音转化为文字怎么样_安徽听见科技

    成都专业语音转化为文字怎么样,安徽听见科技,讯飞听见网站是安徽听见科技有限公司推出的以语音转文字为核心业务的转写服务平台. 成都专业语音转化为文字怎么样, 手机语音转文字软件大全,语音转文字是一个非常 ...

  6. android图片编辑加文字,图片编辑加字安卓版

    在我们日常生活工作中经常会碰到需要我们编辑图片,不管是修图还是排版都会碰到,但是要我们不是专业人士去操作专业的软件就有点为难了,那么,这边为用户推荐图片编辑加字安卓版软件,它具有操作简单,功能强大的优 ...

  7. 合合信息——用智能文字识别技术赋能古彝文原籍数字化

    文章目录 1. 背景介绍:古彝文是什么?为什么要保护它?如何保护它? 2. 传统方法保护古彝文:原籍难获.翻译困难 2.1. 古彝文原籍的破损与古法保存 2.2 古彝文原籍的保护与翻译 2.2.1 获 ...

  8. 药品研发--检验记录与检验报告书的书写细则

    检验记录与检验报告书的书写细则 检验记录是出具检验报告书的依据,是进行科学研究和技术总结的原始资料:为保证药品检验工作的科学性和规范化,检验记录必须做到:记录原始.真实,内容完整.齐全,书写清晰.整洁 ...

  9. Hanzi Weiter的简单应用小案例,在HTML汉字的书写,演示汉字笔画顺序的 汉字笔画库 js vue案例实例

    因为业务需求,上网查询之后写的一个小 demo,参考文档https://hanziwriter.org/ ** 具体实现 ** 在 script 标签加载 Hanzi Writer 只需将以下内容放入 ...

  10. 怎么用计算机写材料,在ps中如何写字?ps文字工具使用教程 -电脑资料

    photoshop是专业的图像处理软件,简称ps,用于在图片上写字只是一个很简单的功能, 在photoshop处理图片时,常常需要在图片中写入一些文字信息.那么这个图片处理软件是怎么写入文字的呢?就要 ...

最新文章

  1. gcc 使用 stdio.h
  2. 设计模式-创建型模式-工厂模式(工厂三兄弟) TypeScript
  3. 权限系统设计模型分析(DAC,MAC,RBAC,ABAC)
  4. 肝了十几个小时的java反射,希望对大家有所帮助吧!
  5. 奔五的人学ios:swift竟然没有字符串包括,找个简单的解决方法
  6. Logistic回归的牛顿法及DFP、BFGS拟牛顿法求解
  7. 如何判断链表中存在环路
  8. 05-Elasticsearch官网译文(1)
  9. linux常用命令(ubuntu)
  10. 不要在有反馈的平台上输出
  11. 【论文写作】SSM校园招聘系统如何写摘要部分
  12. php 服务器 mac地址吗,php获取服务器端mac和客户端mac的地址
  13. 山西计算机应用基本技能,山西应用科技学院计算机应用技术专业课程介绍/专业代码-卧龙指南...
  14. android生命周期_Android片段生命周期
  15. win7一直卡在首次使用计算机,重装win7一直停留在正在启动windows解决方法(完美解决)...
  16. PhotoShop基础——如何抠图
  17. Shiro教程及案例
  18. OA系统审批流程思路梳理
  19. idea社区版创建springboot_idea社区版+spring boot
  20. 29Python时间序列分析(美国消费者信心指数及维基百科点击量EDA,含实例数据)

热门文章

  1. HTML5中多媒体标签之音频标签
  2. 五、python的数据容器(站在前辈们的肩膀上注入自己的理解,强势总结,适合入门,也适合复习)
  3. php草莓派,甜品控的减脂早餐,这样做低卡又裹腹,草莓派香蕉派,好吃分享了...
  4. 使用计算机时,突然断电,存储在下列设备中的信息将丢失的是,下列存储设备中断电后其保存的信息会丢失的是哪一项...
  5. word给大括号公式加编号
  6. 为什么要制定项目计划?
  7. 别和我谈理想,我要的是钱
  8. 浪潮之巅·IT从业者或投资人必读书籍
  9. 高级程序员和普通程序员有哪些区别?
  10. 数据结构与算法的个人学习经验小结(总)