collage-maker/collage/collage.go

73 lines
1.5 KiB
Go

// Package collage makes a pic collage
package collage
import (
"errors"
"fmt"
"image"
"io"
"io/fs"
)
type Dimension struct {
Width uint `json:"width"`
Height uint `json:"height"`
}
type Point struct {
X uint `json:"x"`
Y uint `json:"y"`
}
type Rectangle struct {
Start Point `json:"start"`
End Point `json:"end"`
}
func (r Rectangle) ToImgRect() image.Rectangle {
return image.Rectangle{
Min: image.Point{int(r.Start.X), int(r.Start.Y)},
Max: image.Point{int(r.End.X), int(r.End.Y)},
}
}
type Request struct {
BackgroundImage string `json:"background_image"`
Aspect Dimension `json:"aspect"`
Dimension Dimension `json:"dimension"`
Photos []struct {
ImageName string `json:"image"`
Crop Rectangle `json:"crop"`
Frame Rectangle `json:"frame"`
} `json:"photos"`
}
func Make(req Request, source fs.FS, output io.Writer) {
rec := image.Rect(0, 0, int(req.Aspect.Width), int(req.Aspect.Height))
canvas := image.NewRGBA64(rec)
for photo := range req.Photos {
fmt.Println(photo)
}
fmt.Println(canvas)
}
type HasSubImage interface {
SubImage(r image.Rectangle) image.Image
}
func Crop(img image.Image, r Rectangle) (image.Image, error) {
if imgHS, ok := img.(HasSubImage); ok {
return imgHS.SubImage(r.ToImgRect()), nil
}
return nil, errors.New("image does not support cropping")
}
func GetImage(source fs.FS, imageName string) (image.Image, error) {
imgF, err := source.Open(imageName)
if err != nil {
return nil, err
}
img, _, err := image.Decode(imgF)
return img, err
}