107 lines
2.0 KiB
Go
107 lines
2.0 KiB
Go
package bilds
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"image"
|
|
"os"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"github.com/anthonynsimon/bild/imgio"
|
|
)
|
|
|
|
var jpgExtensions = []string{".jpg", ".jpeg"}
|
|
var pngExtensions = []string{".png"}
|
|
var bmpExtensions = []string{".bmp"}
|
|
|
|
var (
|
|
// ErrWrongSize is thrown when the provided size string does not match the expected form.
|
|
errWrongSize = errors.New("size must be of form [width]x[height], i.e. 400x200")
|
|
)
|
|
|
|
type size struct {
|
|
Width int
|
|
Height int
|
|
}
|
|
|
|
func resolveEncoder(outputfile string, defaultEncoding imgio.Encoder) imgio.Encoder {
|
|
lower := strings.ToLower(outputfile)
|
|
|
|
for _, ext := range jpgExtensions {
|
|
if strings.HasSuffix(lower, ext) {
|
|
return imgio.JPEGEncoder(100)
|
|
}
|
|
}
|
|
|
|
for _, ext := range pngExtensions {
|
|
if strings.HasSuffix(lower, ext) {
|
|
return imgio.PNGEncoder()
|
|
}
|
|
}
|
|
|
|
for _, ext := range bmpExtensions {
|
|
if strings.HasSuffix(lower, ext) {
|
|
return imgio.BMPEncoder()
|
|
}
|
|
}
|
|
|
|
return defaultEncoding
|
|
}
|
|
|
|
func apply(fin, fout string, process func(image.Image) (image.Image, error)) {
|
|
in, err := imgio.Open(fin)
|
|
exitIfNotNil(err)
|
|
|
|
result, err := process(in)
|
|
exitIfNotNil(err)
|
|
|
|
encoder := resolveEncoder(fout, imgio.PNGEncoder())
|
|
err = imgio.Save(fout, result, encoder)
|
|
exitIfNotNil(err)
|
|
}
|
|
|
|
func apply2(fin1, fin2, fout string, process func(image.Image, image.Image) (image.Image, error)) {
|
|
in1, err := imgio.Open(fin1)
|
|
exitIfNotNil(err)
|
|
|
|
in2, err := imgio.Open(fin2)
|
|
exitIfNotNil(err)
|
|
|
|
result, err := process(in1, in2)
|
|
exitIfNotNil(err)
|
|
|
|
encoder := resolveEncoder(fout, imgio.PNGEncoder())
|
|
err = imgio.Save(fout, result, encoder)
|
|
exitIfNotNil(err)
|
|
}
|
|
|
|
func exitIfNotNil(err error) {
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
os.Exit(1)
|
|
}
|
|
}
|
|
|
|
func parseSizeStr(sizestr string) (*size, error) {
|
|
parts := strings.Split(sizestr, "x")
|
|
if len(parts) != 2 {
|
|
return nil, errWrongSize
|
|
}
|
|
|
|
w, err := strconv.Atoi(parts[0])
|
|
if err != nil || w < 0 {
|
|
return nil, errWrongSize
|
|
}
|
|
|
|
h, err := strconv.Atoi(parts[1])
|
|
if err != nil || h < 0 {
|
|
return nil, errWrongSize
|
|
}
|
|
|
|
return &size{
|
|
Width: w,
|
|
Height: h,
|
|
}, nil
|
|
}
|