2018-04-07 16:34:50 +02:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bytes"
|
|
|
|
"image"
|
|
|
|
"image/png"
|
|
|
|
)
|
|
|
|
|
2018-06-04 21:55:35 +02:00
|
|
|
// Image converts an image.Image to DisplayData containing PNG []byte,
|
|
|
|
// or to DisplayData containing error if the conversion fails
|
2018-06-10 23:09:07 +02:00
|
|
|
func Image(img image.Image) Data {
|
2019-04-11 22:22:37 +02:00
|
|
|
bytes, mimeType, err := encodePng(img)
|
2018-06-04 21:55:35 +02:00
|
|
|
if err != nil {
|
2019-04-11 22:22:37 +02:00
|
|
|
return makeDataErr(err)
|
2018-04-07 16:34:50 +02:00
|
|
|
}
|
2018-06-10 23:09:07 +02:00
|
|
|
return Data{
|
2019-04-10 22:15:44 +02:00
|
|
|
Data: MIMEMap{
|
2019-04-11 22:22:37 +02:00
|
|
|
mimeType: bytes,
|
2018-06-04 21:55:35 +02:00
|
|
|
},
|
2019-04-10 22:15:44 +02:00
|
|
|
Metadata: MIMEMap{
|
2019-04-11 22:22:37 +02:00
|
|
|
mimeType: imageMetadata(img),
|
2018-06-04 21:55:35 +02:00
|
|
|
},
|
2019-04-11 22:22:37 +02:00
|
|
|
}
|
2018-04-07 16:34:50 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
// encodePng converts an image.Image to PNG []byte
|
2019-04-11 22:22:37 +02:00
|
|
|
func encodePng(img image.Image) (data []byte, mimeType string, err error) {
|
2018-04-07 16:34:50 +02:00
|
|
|
var buf bytes.Buffer
|
|
|
|
err = png.Encode(&buf, img)
|
|
|
|
if err != nil {
|
|
|
|
return nil, "", err
|
|
|
|
}
|
2019-04-11 22:22:37 +02:00
|
|
|
return buf.Bytes(), MIMETypePNG, nil
|
2018-04-07 16:34:50 +02:00
|
|
|
}
|
|
|
|
|
2019-04-11 22:22:37 +02:00
|
|
|
// imageMetadata returns image size, represented as MIMEMap{"width": width, "height": height}
|
2019-04-10 22:15:44 +02:00
|
|
|
func imageMetadata(img image.Image) MIMEMap {
|
2018-04-07 16:34:50 +02:00
|
|
|
rect := img.Bounds()
|
2019-04-10 22:15:44 +02:00
|
|
|
return MIMEMap{
|
2018-04-07 16:34:50 +02:00
|
|
|
"width": rect.Dx(),
|
|
|
|
"height": rect.Dy(),
|
|
|
|
}
|
|
|
|
}
|