56 lines
1.1 KiB
Go
56 lines
1.1 KiB
Go
//go:build heic
|
|
|
|
package internal
|
|
|
|
|
|
import (
|
|
"bytes"
|
|
"image/jpeg"
|
|
|
|
"github.com/strukturag/libheif-go"
|
|
)
|
|
|
|
// convertHEICtoJPEG converts HEIC image data to JPEG format
|
|
// Returns the converted JPEG data or an error if conversion fails
|
|
// This version requires the libheif library and is enabled with the 'heic' build tag
|
|
func convertHEICtoJPEG(heicData []byte) ([]byte, error) {
|
|
// Create a new HEIF context
|
|
ctx, err := libheif.NewContext()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// Read HEIC data from memory
|
|
err = ctx.ReadFromMemory(heicData)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// Get the primary image handle
|
|
handle, err := ctx.GetPrimaryImageHandle()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// Decode the image to RGB format
|
|
img, err := handle.DecodeImage(libheif.ColorspaceRGB, libheif.ChromaInterleavedRGB, nil)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// Convert to Go's standard image.Image
|
|
goImg, err := img.GetImage()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// Encode as JPEG with high quality
|
|
var buf bytes.Buffer
|
|
err = jpeg.Encode(&buf, goImg, &jpeg.Options{Quality: 90})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return buf.Bytes(), nil
|
|
}
|