galdric/imageOperations.go
imageOperations.goRaw
1package main
2
3import (
4 "bytes"
5 "image"
6 "image/jpeg"
7 "image/png"
8
9 "github.com/anthonynsimon/bild/effect"
10 "github.com/nfnt/resize"
11)
12
13type imgRGBA [][]float64
14
15func dataToImage(data []byte, imageExtension string) (image.Image, error) {
16 reader := bytes.NewReader(data)
17 var img image.Image
18 var err error
19 switch imageExtension {
20 case "png":
21 img, err = png.Decode(reader)
22 case "jpg", "jpeg":
23 img, err = jpeg.Decode(reader)
24 default:
25 img = nil
26 }
27 if err != nil {
28 return img, err
29 }
30 return img, err
31}
32
33func imageToData(img image.Image, imageExtension string) ([]byte, error) {
34 buf := new(bytes.Buffer)
35 var err error
36 switch imageExtension {
37 case "png":
38 err = png.Encode(buf, img)
39 case "jpg", "jpeg":
40 err = jpeg.Encode(buf, img, nil)
41 default:
42 img = nil
43 }
44 if err != nil {
45 return buf.Bytes(), err
46 }
47 return buf.Bytes(), err
48}
49
50func imageToPNG(img image.Image) ([]byte, error) {
51 buf := new(bytes.Buffer)
52 var err error
53 err = png.Encode(buf, img)
54 return buf.Bytes(), err
55}
56
57func imageToHistogram(img image.Image) [][]float64 {
58 bounds := img.Bounds()
59
60 //generate the histogram
61 var histogram [][]float64
62 for y := bounds.Min.Y; y < bounds.Max.Y; y++ {
63 for x := bounds.Min.X; x < bounds.Max.X; x++ {
64 r, g, b, a := img.At(x, y).RGBA()
65 var pixel []float64
66 pixel = append(pixel, float64(r), float64(g), float64(b), float64(a))
67 histogram = append(histogram, pixel)
68 }
69 }
70 return histogram
71}
72
73func Resize(img image.Image) image.Image {
74 r := resize.Resize(uint(config.ImgWidth), uint(config.ImgHeigh), img, resize.Lanczos3)
75 return r
76}
77func EdgeDetection(img image.Image) image.Image {
78 r := effect.EdgeDetection(img, 1.0)
79 return r
80}