// 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 }