BOYYANG/1/blog/可爱粉色连帽衫动漫女孩4K壁纸3840x2160_彼岸图网

go如何将其它类型图片转成webp格式图片

作者: boyyang
分类: 后端开发
发布: 2024-12-19 03:49:08
更新: 2025-03-23 12:41:09
浏览: 160

什么是webp?

WebP 是一种由 Google 开发的图像文件格式,旨在提供比传统格式(如 JPEG 和 PNG)更高的压缩率,同时保持图像质量。WebP 格式支持有损和无损压缩,并且支持透明度(Alpha 通道)和动画。

以下是 WebP 的一些主要特点:

  1. 高压缩率:WebP 格式通常比 JPEG 和 PNG 格式提供更高的压缩率,这意味着在相同的图像质量下,WebP 文件的大小更小,从而加快网页加载速度。
  2. 无损压缩:WebP 支持无损压缩,这意味着压缩过程不会损失图像质量,适合需要高质量图像的场景。
  3. 透明度支持:WebP 格式支持透明度,使得图像可以具有透明背景,这对于创建复杂的图形和设计非常有用。
  4. 动画支持:WebP 格式还支持动画,这意味着可以创建包含多个帧的动态图像,类似于 GIF 格式。
  5. 兼容性:虽然 WebP 格式在性能和压缩率方面具有优势,但并非所有浏览器都原生支持 WebP 格式。为了确保兼容性,通常需要使用 JavaScript 库(如 Google 的 libwebp)或服务器端转换工具将 WebP 格式转换为其他格式。

WebP 格式已经成为许多网站和应用程序中用于图像优化的首选格式,因为它能够提供更好的性能和更小的文件大小。

安装第三方库

go get github.com/chai2010/webp

使用

  1. 通过image.Decode将读取到的[]byte类型的数据转成Image类型
  2. 将image传递给弟三方库进行处理
  3. quality代表图片转换后的质量数值越高代表图片质量越好,相应最终图片大小也会相对更大
package main

import (
	"bytes"
	"fmt"
	"github.com/chai2010/webp"
	"image"
	_ "image/gif"
	_ "image/jpeg"
	_ "image/png"
	"os"
	"path"
	"strings"
)

func main() {
	err := imageToWebp("images/girl.jpg", 10)
	if err != nil {
		fmt.Println(err)
	}
}

func imageToWebp(fileName string, quality float32) error {

	file, err := os.ReadFile(fileName)
	if err != nil {
		return err
	}

	img, _, err := image.Decode(bytes.NewBuffer(file))
	if err != nil {
		return err
	}

	webpBytes, err := webp.EncodeRGBA(img, quality)
	if err != nil {
		return err
	}

	err = os.WriteFile(fmt.Sprintf("%s.webp", fileNameWithoutExt(fileName)), webpBytes, 0644)
	if err != nil {
		return err
	}

	return nil
}

func fileNameWithoutExt(fileName string) string {
	return strings.TrimSuffix(path.Base(fileName), path.Ext(fileName))
}

结果

质量压缩前(M)压缩后
106.5153kb
506.5250kb
1006.52.2M


#go
#后端
#图片压缩