1package imageutil
2
3import (
4 "bytes"
5 "fmt"
6 "os/exec"
7)
8
9// IsHEIC checks if data is a HEIC/HEIF image based on file magic.
10// HEIC files are ISO Base Media File Format containers with specific brand codes.
11func IsHEIC(data []byte) bool {
12 if len(data) < 12 {
13 return false
14 }
15 // ftyp box starts at offset 4, brand at offset 8
16 // Common brands: heic, heix, hevc, hevx, mif1, msf1
17 if data[4] != 'f' || data[5] != 't' || data[6] != 'y' || data[7] != 'p' {
18 return false
19 }
20 brand := string(data[8:12])
21 switch brand {
22 case "heic", "heix", "hevc", "hevx", "mif1", "msf1", "avif":
23 return true
24 }
25 return false
26}
27
28// ConvertHEICToPNG converts HEIC image data to PNG using ImageMagick's convert command.
29// Returns the PNG data or an error if conversion fails.
30func ConvertHEICToPNG(data []byte) ([]byte, error) {
31 cmd := exec.Command("convert", "heic:-", "png:-")
32 cmd.Stdin = bytes.NewReader(data)
33 var stdout, stderr bytes.Buffer
34 cmd.Stdout = &stdout
35 cmd.Stderr = &stderr
36 if err := cmd.Run(); err != nil {
37 return nil, fmt.Errorf("convert heic to png: %w: %s", err, stderr.String())
38 }
39 return stdout.Bytes(), nil
40}