1 package imagefn 2 3 import ( 4 "image" 5 "image/color" 6 ) 7 8 type invert struct { 9 image.Image 10 } 11 12 type invertSet struct { 13 invert 14 setter 15 } 16 17 func Invert(i image.Image) image.Image { 18 in := invert{ 19 Image: i, 20 } 21 if s, ok := i.(setter); ok { 22 return invertSet{ 23 invert: in, 24 setter: s, 25 } 26 } 27 return in 28 } 29 30 func (i invert) At(x, y int) color.Color { 31 r, g, b, a := i.Image.At(x, y).RGBA() 32 return i.Image.ColorModel().Convert(color.RGBA64{ 33 R: uint16(a - r), 34 G: uint16(a - g), 35 B: uint16(a - b), 36 A: uint16(a), 37 }) 38 } 39 40 func (i invert) SubImage(r image.Rectangle) image.Image { 41 return Invert(SubImage(i.Image, r)) 42 } 43 44 func (i invertSet) Set(x, y int, c color.Color) { 45 r, g, b, a := c.RGBA() 46 i.setter.Set(x, y, color.RGBA64{ 47 R: uint16(a - r), 48 G: uint16(a - g), 49 B: uint16(a - b), 50 A: uint16(a), 51 }) 52 }