// Copyright 2012 Google Inc. All rights reserved. // Use of this source code is governed by the Apache 2.0 // license that can be found in the LICENSE file. // Package image provides image services. package image // import "google.golang.org/appengine/image" import ( "context" "fmt" "net/url" "google.golang.org/appengine" "google.golang.org/appengine/internal" pb "google.golang.org/appengine/internal/image" ) type ServingURLOptions struct { Secure bool // whether the URL should use HTTPS // Size must be between zero and 1600. // If Size is non-zero, a resized version of the image is served, // and Size is the served image's longest dimension. The aspect ratio is preserved. // If Crop is true the image is cropped from the center instead of being resized. Size int Crop bool } // ServingURL returns a URL that will serve an image from Blobstore. func ServingURL(c context.Context, key appengine.BlobKey, opts *ServingURLOptions) (*url.URL, error) { req := &pb.ImagesGetUrlBaseRequest{ BlobKey: (*string)(&key), } if opts != nil && opts.Secure { req.CreateSecureUrl = &opts.Secure } res := &pb.ImagesGetUrlBaseResponse{} if err := internal.Call(c, "images", "GetUrlBase", req, res); err != nil { return nil, err } // The URL may have suffixes added to dynamically resize or crop: // - adding "=s32" will serve the image resized to 32 pixels, preserving the aspect ratio. // - adding "=s32-c" is the same as "=s32" except it will be cropped. u := *res.Url if opts != nil && opts.Size > 0 { u += fmt.Sprintf("=s%d", opts.Size) if opts.Crop { u += "-c" } } return url.Parse(u) } // DeleteServingURL deletes the serving URL for an image. func DeleteServingURL(c context.Context, key appengine.BlobKey) error { req := &pb.ImagesDeleteUrlBaseRequest{ BlobKey: (*string)(&key), } res := &pb.ImagesDeleteUrlBaseResponse{} return internal.Call(c, "images", "DeleteUrlBase", req, res) } func init() { internal.RegisterErrorCodeMap("images", pb.ImagesServiceError_ErrorCode_name) }