Skip to content
鼓励作者:欢迎打赏犒劳

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))
}

如有转载或 CV 的请标注本站原文地址