add Make collage

This commit is contained in:
2023-08-11 23:20:53 -04:00
parent 846e191582
commit b298cb019d
2 changed files with 87 additions and 15 deletions

View File

@@ -3,10 +3,13 @@ package collage
import (
"errors"
"fmt"
"image"
"image/draw"
"image/jpeg"
"io"
"io/fs"
"go.oneofone.dev/resize"
)
type Dimension struct {
@@ -31,24 +34,53 @@ func (r Rectangle) ToImgRect() image.Rectangle {
}
}
type Photo struct {
ImageName string `json:"image"`
Crop Rectangle `json:"crop"`
Frame Rectangle `json:"frame"`
}
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"`
Photos []Photo `json:"photos"`
}
func Make(req Request, source fs.FS, output io.Writer) {
func Make(req Request, source fs.FS, output io.Writer) error {
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)
for _, photo := range req.Photos {
img, err := GetImage(source, photo.ImageName)
if err != nil {
return err
}
croppedImage, err := Crop(img, photo.Crop)
if err != nil {
return err
}
destRect := FrameTranslate(req.Aspect, req.Dimension, photo.Frame).ToImgRect()
resizedImg := resize.Resize(uint(destRect.Dx()), uint(destRect.Dy()), croppedImage, resize.Lanczos3)
draw.Draw(canvas, destRect, resizedImg, image.Point{0, 0}, draw.Src)
}
var opt jpeg.Options
opt.Quality = 100
return jpeg.Encode(output, canvas, &opt)
}
func FrameTranslate(resolution Dimension, frameSize Dimension, frame Rectangle) Rectangle {
newX := func(oldX uint) uint {
return oldX * resolution.Width / frameSize.Width
}
newY := func(oldY uint) uint {
return oldY * resolution.Height / frameSize.Height
}
return Rectangle{
Start: Point{newX(frame.Start.X), newY(frame.Start.Y)},
End: Point{newX(frame.End.X), newY(frame.End.Y)},
}
fmt.Println(canvas)
}
type HasSubImage interface {