-
Notifications
You must be signed in to change notification settings - Fork 0
/
image_api.go
93 lines (79 loc) · 2.57 KB
/
image_api.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/*
* Go interface to libheif
*
* Copyright (c) 2018-2024 struktur AG, Joachim Bauch <[email protected]>
*
* libheif is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 3 of
* the License, or (at your option) any later version.
*
* libheif is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with libheif. If not, see <http://www.gnu.org/licenses/>.
*/
package libheif
import (
"image"
"image/color"
"io"
)
// --- High-level decoding API, always decodes primary image (if present).
func decodePrimaryImageFromReader(r io.Reader) (*ImageHandle, error) {
ctx, err := NewContext()
if err != nil {
return nil, err
}
data, err := io.ReadAll(r)
if err != nil {
return nil, err
}
if err := ctx.ReadFromMemory(data); err != nil {
return nil, err
}
handle, err := ctx.GetPrimaryImageHandle()
if err != nil {
return nil, err
}
return handle, nil
}
func decodeImage(r io.Reader) (image.Image, error) {
handle, err := decodePrimaryImageFromReader(r)
if err != nil {
return nil, err
}
img, err := handle.DecodeImage(ColorspaceUndefined, ChromaUndefined, nil)
if err != nil {
return nil, err
}
return img.GetImage()
}
func decodeConfig(r io.Reader) (image.Config, error) {
var config image.Config
handle, err := decodePrimaryImageFromReader(r)
if err != nil {
return config, err
}
config = image.Config{
ColorModel: color.YCbCrModel,
Width: handle.GetWidth(),
Height: handle.GetHeight(),
}
return config, nil
}
func init() {
image.RegisterFormat("heif", "????ftypheic", decodeImage, decodeConfig)
image.RegisterFormat("heif", "????ftypheim", decodeImage, decodeConfig)
image.RegisterFormat("heif", "????ftypheis", decodeImage, decodeConfig)
image.RegisterFormat("heif", "????ftypheix", decodeImage, decodeConfig)
image.RegisterFormat("heif", "????ftyphevc", decodeImage, decodeConfig)
image.RegisterFormat("heif", "????ftyphevm", decodeImage, decodeConfig)
image.RegisterFormat("heif", "????ftyphevs", decodeImage, decodeConfig)
image.RegisterFormat("heif", "????ftypmif1", decodeImage, decodeConfig)
image.RegisterFormat("avif", "????ftypavif", decodeImage, decodeConfig)
image.RegisterFormat("avif", "????ftypavis", decodeImage, decodeConfig)
}