适用于旧版捆绑服务的 Images API

App Engine 可让您使用专门的 Images 服务来处理图片数据。Images 服务可以处理图片、将多个图片合成为单个图片、转换图片格式、提供图片元数据,如格式、宽度、高度和颜色值的直方图。

图片服务可以直接从应用接受图片数据,也可以使用 Cloud Storage 值。(Images 服务还可以使用 Cloud Blobstore 值,但我们建议使用 Cloud Storage。)

存储在 Cloud Storage 和 Cloud Blobstore 中的图片可以达到相应服务允许的最大值。转换后的图片直接返回给应用,并且必须小于 32 MB。

Cloud Storage 存储桶必须使用精细的访问控制列表,以确保 Images API 正常工作。对于已配置为使用统一存储桶级访问权限的存储桶,Images API 将无法提取该存储桶中的图片并会抛出 TransformationError 错误消息。如果您的存储桶正是以这种方式进行配置的,您可以停用统一存储桶级访问权限

在 Python 2 中转换图片

以下示例从 Cloud Datastore 加载图片数据,然后使用 Images 服务调整其大小并以 JPEG 图片的形式将其返回到浏览器。

from google.appengine.api import images
from google.appengine.ext import ndb

import webapp2

class Photo(ndb.Model):
    title = ndb.StringProperty()
    full_size_image = ndb.BlobProperty()

class Thumbnailer(webapp2.RequestHandler):
    def get(self):
        if self.request.get("id"):
            photo = Photo.get_by_id(int(self.request.get("id")))

            if photo:
                img = images.Image(photo.full_size_image)
                img.resize(width=80, height=100)
                img.im_feeling_lucky()
                thumbnail = img.execute_transforms(output_encoding=images.JPEG)

                self.response.headers['Content-Type'] = 'image/jpeg'
                self.response.out.write(thumbnail)
                return

        # Either "id" wasn't provided, or there was no image with that ID
        # in the datastore.
        self.error(404)

除了 Images API 之外,您还可以在 Python 2.7 应用中使用 Python Imaging Library (PIL) 提供的转换功能。您只需在 app.yaml 文件的 libraries 部分中声明此库。但是,如果您希望在本地环境(使用开发服务器)中使用 PIL,还必须在本地下载并安装 PILpillow

可用的图片转换功能

Images 服务可以调整图片大小,旋转、翻转和剪裁图片,以及提高照片质量。它还可以将多个图片合并为一个图片。

调整大小

您可以在保持宽高比不变的情况下调整图片大小。调整后图片的宽度和高度都不能超过 4000 像素。

旋转

您可以将图片旋转 90 度的倍数。

水平翻转

您可以水平翻转图片。

垂直翻转

您可以垂直翻转图片。

剪裁

您可以给定边界框来剪裁图片。

手气不错

“手气不错”转换可增强图片中的暗色和亮色,以及调整这两种颜色并优化对比度。

图片格式

该服务接受 JPEG、PNG、WEBP、GIF(包括动画 GIF)、BMP、TIFF 和 ICO 格式的图片数据。转换后的图片可以采用 JPEG、WEBP 和 PNG 格式返回。

如果输入格式和输出格式不同,该服务在执行转换之前会将输入数据转换为输出格式。

转换图片

Images 服务可以使用 Google Cloud StorageBlobstore 中的值作为转换的图片源。您可以通过以下两种方式来转换图片:

  1. 使用 Image() 类可以执行简单的图片转换,例如剪裁、翻转和旋转。
  2. 使用 get_serving_url() 可以动态调整大小和剪裁图片,因此您无需在服务器上存储不同大小的图片。该方法返回一个提供图片的网址,而且会在该网址中对图片转换进行编码。 此函数假定图片不会改变;如果在获取网址后图片被修改,则您使用该网址可能会出现意外结果。

使用 Image() 类

如果图片大小小于 Cloud Storage 或 Blobstore 允许的最大值,则可以转换 Cloud Storage 或 Blobstore 中的图片。请注意,转换的结果将直接返回给应用,并且不得超过 32 MB 的 API 响应限制。

要使用 Python 2 转换 Cloud Storage 或 Blobstore 中的图片,请不要使用图片数据设置 Image 构造函数的 image_data 参数,而是将 blob_key 参数设置为以此图片作为值的 Blobstore 键。API 的其余部分将按预期方式工作。execute_transforms() 方法返回转换的结果,或者如果结果大于最大大小 (32 MB),则抛出 LargeImageError

from google.appengine.api import images
from google.appengine.ext import blobstore

import webapp2

class Thumbnailer(webapp2.RequestHandler):
    def get(self):
        blob_key = self.request.get("blob_key")
        if blob_key:
            blob_info = blobstore.get(blob_key)

            if blob_info:
                img = images.Image(blob_key=blob_key)
                img.resize(width=80, height=100)
                img.im_feeling_lucky()
                thumbnail = img.execute_transforms(output_encoding=images.JPEG)

                self.response.headers['Content-Type'] = 'image/jpeg'
                self.response.out.write(thumbnail)
                return

        # Either "blob_key" wasn't provided, or there was no value with that ID
        # in the Blobstore.
        self.error(404)

使用 get_serving_url()

除了 Images API 之外,您还可以在 Python 2.7 应用中使用 Python Imaging Library (PIL) 提供的转换功能。为此,您只需在 app.yaml 文件的 libraries 部分中声明此库。

要在开发服务器中使用 PIL,请在本地下载并安装 PILpillow

使用 get_serving_url() 方法,您可为存储在 Cloud Storage 或 Blobstore 中的图片生成固定的专用网址。例如:

url = images.get_serving_url(
    blob_key, size=150, crop=True, secure_url=True)

生成的网址使用高度优化、独立于您应用的图片传送基础架构。由于图片独立于您的应用进行传送,因此不会产生负载,并且经济高效。此方法返回的网址始终可公开访问,但无法猜测。

如果您希望停止提供网址,请使用 delete_serving_url() 函数将其删除。

该方法返回使用指定的大小和剪裁参数编码的网址。如果未指定任何参数,则该方法返回图片的默认网址,例如:

http://lhx.ggpht.com/randomStringImageId

您可以通过在网址中指定参数来动态调整图片大小和剪裁图片。可用参数有:

  • =sxx,其中 xx 是 0-2560 范围内的整数,表示图片最长边的长度(以像素为单位)。例如,如果添加 =s32,则图片的最长边将被调整为 32 像素。
  • =sxx-c,其中 xx 是 0-2560 范围内的整数,表示剪裁后的图片大小(以像素为单位);-c 用于指示系统对图片进行剪裁。
# Resize the image to 32 pixels (aspect-ratio preserved)
http://lhx.ggpht.com/randomStringImageId=s32

# Crop the image to 32 pixels
http://lhx.ggpht.com/randomStringImageId=s32-c

图片和开发服务器

开发服务器使用本地计算机执行 Images 服务的功能。

Python 开发服务器使用 Python Imaging Library (PIL) 模拟 Images 服务。Python 标准库或 SDK 中不包含该库,必须单独进行安装pillow 分支也能正常工作。只有安装了适当的 PIL 解码器插件,才能支持 WEBP 图片格式。

有关删除的注意事项

要停止传送存储在 Cloud Storage 或 Blobstore 中的图片,请调用 delete_serving_url() 函数。

您应该避免直接删除 Cloud Storage 或 Blobstore 中的图片,因为这样做会让这些图片仍可通过传送网址来访问。

如果停用或删除当初创建了传送网址的应用,则即使基础图片仍然可用,传送网址也将失效。

配额、限制和价格

使用 Images API 目前不会产生任何额外费用。请参阅 App Engine 价格页面

每个 Images API 请求都会计入 Image Manipulation API 调用配额。应用可以在单个 API 调用中执行多项图片转换操作。

发送到 Images 服务的数据将计入发送到 (Images) API 的数据配额。从 Images 服务接收的数据将计入从 (Images) API 接收的数据配额。

每项图片转换操作都会计入执行的转换配额。

如需了解详情,请参阅配额。您可以访问 Google Cloud Console 配额详细信息标签页,查看应用的当前配额使用情况。

除了配额以外,在使用 Images 服务时,还应遵循以下限制:

限制
发送到该服务的图片的最大数据大小 32 MB
从该服务接收的图片的最大数据大小 32 MB
从该服务发送或接收的图片的最大大小 50 兆像素