
go 图片处理
heif转jpg
方法1
文件转文件
go
package main
import (
"image/jpeg"
"log"
"os"
"testing"
"github.com/jdeng/goheif"
)
// go get github.com/jdeng/goheif
func convertHeifToJpg(inputPath, outputPath string) error {
f, err := os.Open(inputPath)
if err != nil {
return err
}
defer f.Close()
img, err := goheif.Decode(f)
if err != nil {
return err
}
out, err := os.Create(outputPath)
if err != nil {
return err
}
defer out.Close()
return jpeg.Encode(out, img, &jpeg.Options{Quality: 90})
}
func TestConvertHeifToJpg(t *testing.T) {
if err := convertHeifToJpg("./3.heif", "./3.jpg"); err != nil {
t.Fatal(err)
}
t.Log("success")
}
func main() {
if err := convertHeifToJpg("./3.heif", "./3.jpg"); err != nil {
log.Fatal(err)
}
log.Println("converted")
}方法2
流转文件:基于字节数组的内存转换函数,无需临时文件
go
import (
"bytes"
"image/jpeg"
"github.com/jdeng/goheif"
)
// HeifBytesToJpegBytes 将 HEIF 格式的字节数组转换为 JPEG 格式的字节数组
// 参数 heifData: HEIF 图片的原始字节数据
// 返回: JPEG 格式的字节数据,以及可能发生的错误
func HeifBytesToJpegBytes(heifData []byte) ([]byte, error) {
// 将字节数组包装为 io.Reader
reader := bytes.NewReader(heifData)
// 解码 HEIF 为 image.Image
img, err := goheif.Decode(reader)
if err != nil {
return nil, err
}
// 创建内存缓冲区用于存储 JPEG 编码结果
buf := new(bytes.Buffer)
// 以 90% 质量编码为 JPEG 并写入缓冲区
err = jpeg.Encode(buf, img, &jpeg.Options{Quality: 90})
if err != nil {
return nil, err
}
// 返回缓冲区中的字节切片
return buf.Bytes(), nil
}
package main
import (
"fmt"
"io/ioutil"
"log"
)
func main() {
// 假设从某处读取 HEIF 字节(例如从文件或网络)
heifBytes, err := ioutil.ReadFile("./3.heif")
if err != nil {
log.Fatal(err)
}
jpegBytes, err := HeifBytesToJpegBytes(heifBytes)
if err != nil {
log.Fatal(err)
}
fmt.Printf("转换成功,JPEG 大小: %d 字节\n", len(jpegBytes))
// 可直接将 jpegBytes 上传到 OSS
// ossClient.PutObject("bucket", "object.jpg", bytes.NewReader(jpegBytes))
}
