返回顶部
首页 > 资讯 > 后端开发 > GO >go实现图片拼接与文字书写的方法实例
  • 794
分享到

go实现图片拼接与文字书写的方法实例

2024-04-02 19:04:59 794人浏览 泡泡鱼
摘要

目录零:背景一:图片拼接1.1 图片拼接代码1.2 从本地、网络读取图片二:文字书写总结零:背景 这是我工作中实际碰到的后端生成图片拼接和文字贴图需求。特此总结下来,方便后人。文中代

零:背景

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

一:图片拼接

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

直接上代码

1.1 图片拼接代码

//图片拼接
func MergeImageNew(base image.Image, mask image.Image, paddingX int, paddingY int) (*image.RGBA, error) {
	baseSrcBounds := base.Bounds().Max

	maskSrcBounds := mask.Bounds().Max

	newWidth := baseSrcBounds.X
	newHeight := baseSrcBounds.Y

	maskWidth := maskSrcBounds.X
	maskHeight := maskSrcBounds.Y

	des := image.NewRGBA(image.Rect(0, 0, newWidth, newHeight)) // 底板
	//首先将一个图片信息存入jpg
	draw.Draw(des, des.Bounds(), base, base.Bounds().Min, draw.Over)
	//将另外一张图片信息存入jpg
	draw.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.Font
	FontSize  float64
	FontColor *image.UnifORM
	TextWidth 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().Max
	newWidth := baseSrcBounds.X
	newHeight := baseSrcBounds.Y
	des := image.NewRGBA(image.Rect(0, 0, newWidth, newHeight)) // 底板
	//首先将一个图片信息存入jpg
	draw.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实现图片拼接与文字书写的文章就介绍到这了,更多相关go实现图片拼接文字书写内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: go实现图片拼接与文字书写的方法实例

本文链接: https://lsjlt.com/news/163885.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • go实现图片拼接与文字书写的方法实例
    目录零:背景一:图片拼接1.1 图片拼接代码1.2 从本地、网络读取图片二:文字书写总结零:背景 这是我工作中实际碰到的后端生成图片拼接和文字贴图需求。特此总结下来,方便后人。文中代...
    99+
    2024-04-02
  • go怎么实现图片拼接与文字书写
    本文小编为大家详细介绍“go怎么实现图片拼接与文字书写”,内容详细,步骤清晰,细节处理妥当,希望这篇“go怎么实现图片拼接与文字书写”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一:图片拼接go标准库的image...
    99+
    2023-06-29
  • pytho多张图片的无损拼接的实现示例
    目录导入 python 库查看需要拼接的图片横向拼接保存拼接后的图片总结纵向拼接图片间距导入 python 库 import matplotlib.pyplot as plt i...
    99+
    2024-04-02
  • Python字符串拼接的4种方法实例
    目录1. 算术运算符拼接(1)+算术运算符(2) * 算术运算符2、format方法3、百分号操作符4、特殊符号f附:常见字符串去除空格的方法总结总结在程序实际应用中,少不了要进行字...
    99+
    2024-04-02
  • Shell 字符串拼接的实现示例
    1. 字符串声明 概述 字符串的基本操作 脚本 1 # 声明字符串 str01="str01" echo ${str01} # 单引号也可以 # 不过后面的例子, 通常是用 双引号, 具体原因, 以后会解...
    99+
    2022-06-04
    Shell 字符串拼接
  • Go语言中字符串拼接的实现方式探究
    Go语言中字符串拼接的实现方式探究 在Go语言中,字符串是不可变的,即一旦创建后就无法直接修改其内容。因此,在进行字符串拼接时,需要特殊的处理方式来保证效率和性能。本文将探究Go语言中...
    99+
    2024-03-12
    字符串 探究 拼接 go语言
  • mysql 字段括号拼接的实现示例
    目录1. 概述2. 步骤详解步骤1:连接到mysql数据库步骤2:构造SQL查询语句步骤3:执行SQL查询语句步骤4:处理查询结果步骤5:关闭数据库连接总结1. 概述 在使用MySQL进行数据查询时,有时候需要对字段进行...
    99+
    2024-01-29
    mysql 字段括号拼接 mysql 字段拼接
  • OpenCV全景图像拼接的实现示例
    本文主要介绍了OpenCV全景图像拼接的实现示例,分享给大家,具体如下: left_01.jpg right_01.jpg Stitcher.py import numpy ...
    99+
    2024-04-02
  • python怎么实现多张图片的无损拼接
    本篇内容主要讲解“python怎么实现多张图片的无损拼接”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“python怎么实现多张图片的无损拼接”吧!目录导入 python 库查看需要拼接的图片横向...
    99+
    2023-06-20
  • mysql字符串拼接并设置null值的实例方法
    #字符串拼接 concat(s1,s2); 将表中last_name和first_name中的字符串拼接 select concat(last_name,first_na...
    99+
    2024-04-02
  • vue实现复制文字复制图片实例详解
    目录正文方法复制文本复制图片正文 复制文字和图片是我们经常会使用到的需求,我们这篇文章主要介绍使用navigator.clipboard.write()来实现复制文字和图片。不过这...
    99+
    2023-02-23
    vue复制文字图片 vue 复制
  • Android实现自定义带文字和图片Button的方法
    本文实例讲述了Android实现自定义带文字和图片Button的方法。分享给大家供大家参考。具体分析如下: 在Android开发中经常会需要用到带文字和图片的button,下面...
    99+
    2022-06-06
    button 自定义 方法 Android
  • Node.js读写文件之批量替换图片的实现方法
    问题:文件夹A中有大量图片文件,需要用另外一个图片替换掉A中图片,但是命名保持不变。 手工的做法如下: 1)浏览器打开图片->2)另存为->3)目标文件夹->4)找到一个图片->5)...
    99+
    2022-06-04
    批量 文件 方法
  • Android实现图片循环播放的实例方法
    很多时候,我们需要展示在客户端展示图片,而且是动态显示,即不停地自行切换图片。下面我们来看一下具体的实现方法。首先,我们需要在XML...    ...
    99+
    2022-06-06
    方法 循环 图片 Android
  • C# 汉字与拼音互转的实现示例
    这个功能,大家也都可以去百度以下,千篇一律都自己写的(抄的)封装好的公共类,此处还是得膜拜下原创的大佬,可以花时间去搞这个,我看着都头皮发麻。 对于一个有代码洁癖的码农来说,我并不喜...
    99+
    2024-04-02
  • Flask接收上传图片方法实现
    目录方案一:下面是复杂的写法:方案二:下面是简单写法:接下来给搭建讲解Flask如何接受图片文件,上面是复杂写法,下面是简单写法,二选一即可。 思路整理:接收图片->定义一个图...
    99+
    2024-04-02
  • Python实现识别图片为文字的示例代码
    目录1、环境准备2、业务实现3、效果展示本来想着做一个将图片识别为文字的小功能,本想到Google上面第一页全是各种收费平台的广告。 这些平台提供的基本都是让我们通过调用相关的三方接...
    99+
    2024-04-02
  • Android编程实现给Button添加图片和文字的方法
    本文实例讲述了Android编程实现给Button添加图片和文字的方法。分享给大家供大家参考,具体如下: //为按钮添加图片和文字的方法 public Spanned get...
    99+
    2022-06-06
    button 方法 图片 Android
  • 使用Go语言文档中的strings.Join函数实现字符串拼接
    使用Go语言实现字符串拼接,是日常编程工作中非常常见的需求。其中,Go语言内置的strings.Join函数可以帮助我们轻松地实现字符串拼接。本文将介绍如何使用Go语言文档中的strings.Join函数实现字符串拼接,并提供具体的代码示例...
    99+
    2023-11-04
    Go语言 字符串拼接 stringsJoin函数
  • MySQL多个字段拼接去重的实现示例
    目录什么是多个字段拼接去重使用mysql进行多个字段拼接去重创建测试表使用GROUP_CONCAT函数进行拼接使用CONCAT_WS函数进行拼接去除重复的拼接结果总结在MySQL中,我们经常会遇到需要将多个字段进行拼接并...
    99+
    2024-01-29
    MySQL字段拼接去重 MySQL拼接去重
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作