Go 图片绘制、合成设计

Go 语言中的图片处理

使用 disintegration/imaging 和其他库,在 Go 语言中处理图片,如绘制、合成、旋转、压缩和裁剪等操作,可以使用多个强大的库来简化开发过程。本文将介绍如何结合使用 github.com/disintegration/imaging 和其他如 github.com/icza/gox/imagex/colorx、golang.org/x/image/font 和 golang.org/x/image/font/opentype 等库来实现这些功能。

环境准备

首先,确保你已经安装了 Go 环境,并可以通过 go get 命令安装以下库:

go get github.com/disintegration/imaging  
go get github.com/icza/gox/imagex/colorx  
go get golang.org/x/image/font  
go get golang.org/x/image/font/opentype

1. 绘制文本

使用 disintegration/imaging 和 golang.org/x/image/font/opentype 可以在图片上绘制文本。

package main  
  
import (  
    "fmt"  
    "image"  
    "image/color"  
    "io/ioutil"  
    "log"  
  
    "github.com/disintegration/imaging"  
    "golang.org/x/image/font"  
    "golang.org/x/image/font/opentype"  
    "golang.org/x/image/math/fixed"  
)  
  
func main() {
     
    // 加载字体  
    fontData, err := ioutil.ReadFile("path/to/your/font.ttf")  
    if err != nil {
     
        log.Fatal(err)  
    }  
    f, err := opentype.Parse(fontData)  
    if err != nil {
     
        log.Fatal(err)  
    }  
  
    // 创建字体面  
    face := truetype.NewFace(f, &truetype.Options{
     
        Size:    24,  
        DPI:     72,  
        Hinting: font.HintingFull,  
    })  
  
    // 加载图片  
    src, err := imaging.Open("path/to/your/image.jpg")  
    if err != nil {
     
        log.Fatal(err)  
    }  
  
    // 绘制文本  
    dst := imaging.Draw(src, image.Pt(100, 100), &image.Uniform{
   color.RGBA{
   255, 255, 255, 255}}, image.Point{
   }, image.ZeroRectangle)  
    d := &font.Drawer{
     
        Dst:  dst,  
        Src:  image.NewUniform(color.RGBA{
   0, 0, 0, 255}),  
        Face: face,  
        Dot:  fixed.P(100, 120),  
    }  
    d.DrawString("Hello, world!")  
  
    // 保存或显示图片  
    err = imaging.Save(dst, "output.png")  
    if err != nil {
     
        log.Fatal(err)  
    }  
  
    fmt.Println("Image processed and saved!")  
}

2. 图片合成

使用 imaging.Overlay 可以将两个图片合成为一个。

// 假设已有 src 和 overlay 两张图片  
dst := imaging.Overlay(src, overlay, image.Pt(50, 50), 0.5) // 0.5 是透明度

3. 图片旋转

使用 imaging.Rotate 可以旋转图片。

// 旋转 90 度  
rotated := imaging.Rotate(src, 90, nil)

4. 图片压缩

imaging 库提供了多种调整图片尺寸和质量的方式,以此来压缩图片。

// 压缩图片质量  
compressed := imaging.Resize(src, 800, 600, imaging.Lanczos)  
compressed = imaging.AdjustQuality(compressed, 80) // 80% 的质量

5. 图片裁剪

裁剪图片同样简单。

// 裁剪图片  
cropped := imaging.Crop(src, image.Rect(100, 100, 400, 400))

总结

通过上述示例,你可以看到在 Go 语言中处理图片的强大能力,特别是使用 disintegration/imaging 库结合其他相关库。这些操作(绘制、合成、旋转、压缩、裁剪)是图片处理中的常见需求,而 Go 语言提供的这些库使得这些任务变得简单且高效。

注意事项

字体路径:在绘制文本时,确保你有一个有效的字体文件路径,并且该文件是可读的。
图片路径:加载图片时,同样需要确保图片路径正确且文件存在。
错误处理:在进行图片处理时,始终要检查并处理可能出现的错误,如文件读取失败、字体解析错误等。
性能考虑:对于大型图片或高频请求的场景,需要考虑图片处理的性能问题。可能需要优化算法、使用缓存或调整处理逻辑。
进一步优化
使用并发:对于批量处理图片的场景,可以考虑使用 Go 的并发特性来加速处理过程。
内存管理:在处理大量图片时,注意内存的使用情况,避免内存泄漏或溢出。
第三方服务:对于复杂的图片处理需求,如人脸识别、图像识别等,可以考虑使用第三方服务或库。
示例完整性
为了保持示例的完整性,以下是一个结合了上述多个功能的完整 Go 程序示例:

package img

import (
	"bytes"
	"encoding/base64"
	"fmt"
	"gitee.com/bobo-rs/idea-space-framework/pkg/ifont"
	"github.com/disintegration/imaging"
	"github.com/gogf/gf/v2/errors/gerror"
	"github.com/gogf/gf/v2/os/gfile"
	"github.com/icza/gox/imagex/colorx"
	"golang.org/x/image/font"
	"golang.org/x/image/font/opentype"
	"image"
	"image/color"
	_ "image/gif"
	_ "image/jpeg"
	_ "image/png"
	"os"
	"path/filepath"
	"strconv"
	"strings"
)

type IHandle struct {
   
	img            image.Image // 背景图
	path           string      // 图片路径
	fontPath       string      // 字体路径
	dir            string      // 保存附件地址
	filename       string      // 文件名
	suffix         string      // 文件名后缀
	filenameSuffix string      // 文件名拼接后缀名
}

type (
	// IOverlayItem 图片合成属性
	IOverlayItem struct {
   
		Src        string        `json:"path" dc:"配图地址"`
		PointX     int           `json:"point_x" dc:"位置坐标X"`
		PointY     int           `json:"point_y" dc:"位置坐标Y"`
		Opacity    float64       `json:"opacity" dc:"透明度0-1"`
		UnderColor string        `json:"under_color" dc:"配图色系"`
		DrawText   *DrawTextItem `json:"draw_texts" dc:"绘制字体文本属性"`
	}

	// DrawTextItem 绘制文本属性
	DrawTextItem struct {
   
		Text     string  `json:"text" dc:"文字"`
		ColorHex string  `json:"color_hex" dc:"字体颜色(二进制)"`
		TextType uint    `json:"text_type" dc:"文本类型:0空白(无需绘制), 1文本(无需分割),2分割文本(如:价格)"`
		FontSize float64 `json:"font_size" dc:"文本字体大小"`
		TextX    int     `json:"text_x" dc:"文本X坐标"`
		TextY    int     `json:"text_y" dc:"文本Y坐标"`
		Sep      string  `json:"sep" dc:"分割符:指定文案类型"`
	}

	// FlipTypeEnums 翻转类型
	FlipTypeEnums uint
)

const (
	FlipTypeH          FlipTypeEnums = iota // 水平翻转图像
	FlipTypeV                               //垂直翻转图像
	FlipTypeTranspose                       //水平翻转图像并逆时针旋转90度
	FlipTypeTransverse                      // 垂直翻转图像并逆时针旋转90度
	FlipTypeRotate90                        // 旋转90度
	//FlipTypeRotate                          // 自定义
)

func New() *IHandle {
   
	return &IHandle{
   }
}

// Open 打开图片
func (h *IHandle) Open() (image.Image, error)</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bobo-rs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值