/
image.go
80 lines (67 loc) · 1.7 KB
/
image.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
package ssvgc
import (
"encoding/xml"
"image"
"strings"
"github.com/disintegration/imaging"
)
type Image struct {
commonElement
href string
filter imaging.ResampleFilter
}
var resampleFilters map[string]imaging.ResampleFilter = map[string]imaging.ResampleFilter{
"nearestneighbor": imaging.NearestNeighbor,
"box": imaging.Box,
"linear": imaging.Linear,
"hermite": imaging.Hermite,
"mitchellnetravali": imaging.MitchellNetravali,
"catmullrom": imaging.CatmullRom,
"bspline": imaging.BSpline,
"gaussian": imaging.Gaussian,
"bartlett": imaging.Bartlett,
"lanczos": imaging.Lanczos,
"hann": imaging.Hann,
"hamming": imaging.Hamming,
"blackman": imaging.Blackman,
"welch": imaging.Welch,
"cosine": imaging.Cosine,
}
func NewImage() *Image {
i := &Image{}
i.filter = imaging.NearestNeighbor
return i
}
func (i *Image) SetAttribute(name string, value string) {
switch name {
case "href":
i.href = value
case "resample-filter":
if filter, ok := resampleFilters[strings.ToLower(value)]; ok {
i.filter = filter
}
default:
i.commonElement.SetAttribute(name, value)
}
i.upToDate = false
}
func (i *Image) ParseAttributes(start *xml.StartElement) {
for _, attr := range start.Attr {
i.SetAttribute(attr.Name.Local, attr.Value)
}
}
func (i *Image) Draw() image.Image {
if i.canvas != nil && i.upToDate {
return i.canvas
}
m, err := imaging.Open(i.href)
if err != nil {
return image.Transparent
}
if i.width|i.height != 0 {
m = imaging.Resize(m, i.width, i.height, i.filter)
}
size := m.Bounds().Size()
i.setDimensions(size.X, size.Y)
return m
}