heic.go

 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}