golang 实现图片(gif/jpeg/png)转webp

新建转换工具类

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: qcBlog go报错 cgo: C compiler "gcc" not found: exec: "gcc": executable file not found in %

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Golang 中,Future 和 Promise 的概念通常被称为 Channel。Channel 是一种用于在 Goroutine 之间进行通信和同步的机制,类似于 Unix 系统中的管道。Future 和 Promise 的概念可以通过 Channel 来实现。 Future 是一个表示异步操作结果的对象,它可以让你在不阻塞当前线程的情况下等待异步操作完成。在 Golang 中,可以使用一个带缓冲的 Channel 来实现 Future。当异步操作完成时,会向 Channel 中写入结果,而 Future 对象会等待 Channel 中有数据可读。 例如,下面的代码演示了如何使用 Channel 实现 Future: ``` func asyncOperation() <-chan int { result := make(chan int, 1) go func() { // 异步操作 time.Sleep(time.Second) result <- 42 }() return result } func main() { // 启动异步操作 future := asyncOperation() // 在不阻塞当前线程的情况下等待异步操作完成 fmt.Println("Waiting for async operation...") value := <-future fmt.Printf("Async operation completed with result: %d\n", value) } ``` Promise 是一个表示异步操作的未来结果的对象,它可以让你在异步操作完成之前先返回一个对象,然后在异步操作完成之后再向该对象写入结果。在 Golang 中,可以使用一个未缓冲的 Channel 来实现 Promise。当异步操作完成时,会向 Channel 中写入结果,而 Promise 对象在等待 Channel 可写时会被阻塞。 例如,下面的代码演示了如何使用 Channel 实现 Promise: ``` type Promise struct { result chan int } func asyncOperation() *Promise { promise := &Promise{make(chan int)} go func() { // 异步操作 time.Sleep(time.Second) promise.result <- 42 }() return promise } func main() { // 启动异步操作 promise := asyncOperation() // 在异步操作完成之前先返回一个对象 fmt.Println("Async operation started...") // 在异步操作完成之后再获取结果 value := <-promise.result fmt.Printf("Async operation completed with result: %d\n", value) } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值