// Copyright 2016 Google Inc. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package vision import ( "io" "io/ioutil" pb "google.golang.org/genproto/googleapis/cloud/vision/v1" ) // An Image represents the contents of an image to run detection algorithms on, // along with metadata. Images may be described by their raw bytes, or by a // reference to a a Google Cloude Storage (GCS) object. type Image struct { // Exactly one of content and gcsURI will be non-zero. content []byte // raw image bytes uri string // URI of the form "gs://BUCKET/OBJECT", or public URL // Rect is a rectangle on the Earth's surface represented by the // image. It is optional. Rect *LatLngRect // LanguageHints is a list of languages to use for text detection. In most // cases, leaving this field nil yields the best results since it enables // automatic language detection. For languages based on the Latin alphabet, // setting LanguageHints is not needed. In rare cases, when the language of // the text in the image is known, setting a hint will help get better // results (although it will be a significant hindrance if the hint is // wrong). Text detection returns an error if one or more of the specified // languages is not one of the supported languages (See // https://cloud.google.com/translate/v2/translate-reference#supported_languages). LanguageHints []string } // NewImageFromReader reads the bytes of an image from rc, then closes rc. // // You may optionally set Rect and LanguageHints on the returned Image before // using it. func NewImageFromReader(r io.ReadCloser) (*Image, error) { bytes, err := ioutil.ReadAll(r) if err != nil { return nil, err } if err := r.Close(); err != nil { return nil, err } return &Image{content: bytes}, nil } // NewImageFromURI returns an image that refers to an object in Google Cloud Storage // (when the uri is of the form "gs://BUCKET/OBJECT") or at a public URL. // // You may optionally set Rect and LanguageHints on the returned Image before // using it. func NewImageFromURI(uri string) *Image { return &Image{uri: uri} } // toProtos converts the Image to the two underlying API protos it represents, // pb.Image and pb.ImageContext. func (img *Image) toProtos() (*pb.Image, *pb.ImageContext) { var pimg *pb.Image switch { case img.content != nil: pimg = &pb.Image{Content: img.content} case img.uri != "": pimg = &pb.Image{Source: &pb.ImageSource{ImageUri: img.uri}} } var pctx *pb.ImageContext if img.Rect != nil || len(img.LanguageHints) > 0 { pctx = &pb.ImageContext{ LatLongRect: img.Rect.toProto(), LanguageHints: img.LanguageHints, } } return pimg, pctx }