go实现图片转webp

发布时间:2023-08-25 09:32:13
修改时间:2025-04-29 15:27:22
总阅读数:496
今日阅读数:0
昨日日阅读数:1
字数:2269

新建转换工具类

util/webpUtil.go
package util

import (
	"bytes"
	"github.com/chai2010/webp"
	"image"
	_ "image/gif"
	_ "image/jpeg"
	_ "image/png"
	"io/ioutil"
	"log"
)

// ImageBytes2WebpBytes 将图片转为webp
// inputFile 图片字节切片(仅限gif,jpeg,png格式)
// outputFile webp图片字节切片
// 图片质量
func ImageBytes2WebpBytes(input []byte, quality float32) ([]byte, error) {

	//解析图片
	img, format, err := image.Decode(bytes.NewBuffer(input))
	if err != nil {
		log.Println("图片解析失败")
		return nil, err
	}

	log.Println("原始图片格式:", format)

	//转为webp
	webpBytes, err := webp.EncodeRGBA(img, quality)

	if err != nil {
		log.Println("解析图片失败", err)
		return nil, err
	}

	return webpBytes, nil
}

// Image2Webp 将图片转为webp
// inputFile 图片路径(仅限gif,jpeg,png格式)
// outputFile 图片输出路径
// 图片质量
func Image2Webp(inputFile string, outputFile string, quality float32) error {

	// 读取文件
	fileBytes, err := ioutil.ReadFile(inputFile)
	if err != nil {
		log.Println("读取文件失败:", err)
		return err
	}

	webpBytes, err := ImageBytes2WebpBytes(fileBytes, quality)

	if err != nil {
		log.Println("解析图片失败", err)
		return err
	}

	if err = ioutil.WriteFile(outputFile, webpBytes, 0666); err != nil {
		log.Println("图片写入失败", err)
		return err
	}

	originalSize := len(fileBytes)
	webpSize := len(webpBytes)
	log.Printf("原始大小:%d k,转换后大小:%d k,压缩比:%d %% \n", originalSize/1024, webpSize/1024, webpSize*100/originalSize)

	return nil
}

新建main文件

main.go
package main

import (
	"os"
	"webpTools/util"
)

func main() {

	input := ".\\input\\aa.jpg"
	output := ".\\input\\aaaa.webp"
	quality := 50

	err := util.Image2Webp(input, output, float32(quality))
	if err != nil {
		log.Print("图片转换失败:", err.Error())
		os.Exit(1)
	} else {
		log.Print("转换完成")
	}

}




控制台输出日志

2023/08/25 17:31:26 原始图片格式: jpeg
2023/08/25 17:31:27 原始大小:500 k,转换后大小:69 k,压缩比:13 % 
2023/08/25 17:31:27 转换完成

出现报错

cgo: C compiler "gcc" not found: exec: "gcc": executable file not found in %

按照说明配置gcc: https://blog.qcoder.cn/blogDetail/76