120 lines
2.4 KiB
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
|
|
}
|