1
0
Fork 0
photos/cmd/thumbnail/thumbnail.go

120 lines
2.4 KiB
Go

package main
import (
"bytes"
"io/ioutil"
"log"
"net/http"
"os"
"time"
"github.com/davidbyttow/govips/pkg/vips"
"github.com/minio/minio-go/v6"
)
var client *http.Client
var minioClient *minio.Client
const maxAspectRatio = 6
var accessKey string
var secretKey string
var endpoint string
var endpointSecure bool
func main() {
// Read configuration
accessKey = os.Getenv("MINIO_ACCESS_KEY")
secretKey = os.Getenv("MINIO_SECRET_KEY")
endpoint = os.Getenv("MINIO_ENDPOINT")
endpointSecure = os.Getenv("MINIO_ENDPOINT_SECURE") == "true"
// Setup HTTP client
transport := &http.Transport{
MaxIdleConns: 4,
MaxIdleConnsPerHost: 4,
IdleConnTimeout: 30 * time.Second,
DisableCompression: true,
}
client = &http.Client{
Transport: transport,
Timeout: 5 * time.Second,
}
// Setup minio client
var err error
minioClient, err = minio.New(endpoint, accessKey, secretKey, endpointSecure)
if err != nil {
panic(err)
}
// Setup vips
vips.Startup(nil)
defer vips.Shutdown()
buf, err := fetch("https://huge.makerforce.io/pub/MVIMG_20200320_154434.jpg")
if err != nil {
panic(err)
}
start := time.Now()
resizedBufWEBP, err := resize(buf, vips.ImageTypeWEBP, 320, 70)
end := time.Now()
if err != nil {
panic(err)
}
log.Println("passed", end.Sub(start))
start = time.Now()
resizedBufJPEG, err := resize(buf, vips.ImageTypeJPEG, 320, 75)
end = time.Now()
if err != nil {
panic(err)
}
log.Println("passed", end.Sub(start))
err = save(resizedBufWEBP, "pub", "out.webp", "image/webp")
if err != nil {
panic(err)
}
err = save(resizedBufJPEG, "pub", "out.jpg", "image/jpeg")
if err != nil {
panic(err)
}
}
func fetch(url string) ([]byte, error) {
resp, err := client.Get(url)
if err != nil {
return nil, err
}
defer resp.Body.Close()
return ioutil.ReadAll(resp.Body)
}
func resize(buf []byte, format vips.ImageType, height, quality int) ([]byte, error) {
i, err := vips.NewImageFromBuffer(buf)
if err != nil {
return nil, err
}
defer i.Close()
scale := float64(height) / float64(i.Height())
err = i.Resize(scale)
if err != nil {
return nil, err
}
outBuf, _, err := i.Export(vips.ExportParams{
Format: format,
Quality: quality,
})
return outBuf, err
}
func save(buf []byte, bucket, key, contentType string) error {
_, err := minioClient.PutObject(bucket, key, bytes.NewBuffer(buf), int64(len(buf)), minio.PutObjectOptions{
ContentType: contentType,
StorageClass: "REDUCED_REDUNDANCY",
})
return err
}