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 }