notify.moe/arn/GroupImage.go
2019-06-04 12:16:27 +09:00

169 lines
4.6 KiB
Go

package arn
import (
"bytes"
"image"
"path"
"time"
"github.com/akyoto/imageserver"
)
const (
// GroupImageSmallWidth is the minimum width in pixels of a small group image.
GroupImageSmallWidth = 70
// GroupImageSmallHeight is the minimum height in pixels of a small group image.
GroupImageSmallHeight = 70
// GroupImageLargeWidth is the minimum width in pixels of a large group image.
GroupImageLargeWidth = 280
// GroupImageLargeHeight is the minimum height in pixels of a large group image.
GroupImageLargeHeight = 280
// GroupImageWebPQuality is the WebP quality of group images.
GroupImageWebPQuality = 70
// GroupImageJPEGQuality is the JPEG quality of group images.
GroupImageJPEGQuality = 70
// GroupImageQualityBonusLowDPI ...
GroupImageQualityBonusLowDPI = 12
// GroupImageQualityBonusLarge ...
GroupImageQualityBonusLarge = 10
// GroupImageQualityBonusSmall ...
GroupImageQualityBonusSmall = 15
)
// Define the group image outputs
var groupImageOutputs = []imageserver.Output{
// Original at full size
&imageserver.OriginalFile{
Directory: path.Join(Root, "images/groups/original/"),
Width: 0,
Height: 0,
Quality: 0,
},
// JPEG - Small
&imageserver.JPEGFile{
Directory: path.Join(Root, "images/groups/small/"),
Width: GroupImageSmallWidth,
Height: GroupImageSmallHeight,
Quality: GroupImageJPEGQuality + GroupImageQualityBonusLowDPI + GroupImageQualityBonusSmall,
},
// JPEG - Large
&imageserver.JPEGFile{
Directory: path.Join(Root, "images/groups/large/"),
Width: GroupImageLargeWidth,
Height: GroupImageLargeHeight,
Quality: GroupImageJPEGQuality + GroupImageQualityBonusLowDPI + GroupImageQualityBonusLarge,
},
// WebP - Small
&imageserver.WebPFile{
Directory: path.Join(Root, "images/groups/small/"),
Width: GroupImageSmallWidth,
Height: GroupImageSmallHeight,
Quality: GroupImageWebPQuality + GroupImageQualityBonusLowDPI + GroupImageQualityBonusSmall,
},
// WebP - Large
&imageserver.WebPFile{
Directory: path.Join(Root, "images/groups/large/"),
Width: GroupImageLargeWidth,
Height: GroupImageLargeHeight,
Quality: GroupImageWebPQuality + GroupImageQualityBonusLowDPI + GroupImageQualityBonusLarge,
},
}
// Define the high DPI group image outputs
var groupImageOutputsHighDPI = []imageserver.Output{
// JPEG - Small
&imageserver.JPEGFile{
Directory: path.Join(Root, "images/groups/small/"),
Width: GroupImageSmallWidth * 2,
Height: GroupImageSmallHeight * 2,
Quality: GroupImageJPEGQuality + GroupImageQualityBonusSmall,
},
// JPEG - Large
&imageserver.JPEGFile{
Directory: path.Join(Root, "images/groups/large/"),
Width: GroupImageLargeWidth * 2,
Height: GroupImageLargeHeight * 2,
Quality: GroupImageJPEGQuality + GroupImageQualityBonusLarge,
},
// WebP - Small
&imageserver.WebPFile{
Directory: path.Join(Root, "images/groups/small/"),
Width: GroupImageSmallWidth * 2,
Height: GroupImageSmallHeight * 2,
Quality: GroupImageWebPQuality + GroupImageQualityBonusSmall,
},
// WebP - Large
&imageserver.WebPFile{
Directory: path.Join(Root, "images/groups/large/"),
Width: GroupImageLargeWidth * 2,
Height: GroupImageLargeHeight * 2,
Quality: GroupImageWebPQuality + GroupImageQualityBonusLarge,
},
}
// SetImageBytes accepts a byte buffer that represents an image file and updates the group image.
func (group *Group) SetImageBytes(data []byte) error {
// Decode
img, format, err := image.Decode(bytes.NewReader(data))
if err != nil {
return err
}
return group.SetImage(&imageserver.MetaImage{
Image: img,
Format: format,
Data: data,
})
}
// SetImage sets the group image to the given MetaImage.
func (group *Group) SetImage(metaImage *imageserver.MetaImage) error {
var lastError error
// Save the different image formats and sizes in low DPI
for _, output := range groupImageOutputs {
err := output.Save(metaImage, group.ID)
if err != nil {
lastError = err
}
}
// Save the different image formats and sizes in high DPI
for _, output := range groupImageOutputsHighDPI {
err := output.Save(metaImage, group.ID+"@2")
if err != nil {
lastError = err
}
}
group.Image.Extension = metaImage.Extension()
group.Image.Width = metaImage.Image.Bounds().Dx()
group.Image.Height = metaImage.Image.Bounds().Dy()
group.Image.AverageColor = GetAverageColor(metaImage.Image)
group.Image.LastModified = time.Now().Unix()
return lastError
}
// HasImage returns true if the group has an image.
func (group *Group) HasImage() bool {
return group.Image.Extension != "" && group.Image.Width > 0
}