图片处理是OSS提供的海量、安全、低成本、高可靠的图片处理服务。原始图片上传到OSS后,您可以通过简单的RESTful接口,在任何时间、任何地点、任何互联网设备上对图片进行处理。

图片处理的详细信息请参见OSS图片处理指南

图片处理的完整代码请参见:GitHub

图片处理功能

OSS图片处理提供以下功能:

图片处理使用

图片处理使用标准的HTTP GET请求。您可以在URL的QueryString中设置处理参数。

如果图片文件的访问权限为私有读写,必须通过授权才能进行访问。

  • 匿名访问

    您可以通过如下格式的三级域名匿名访问处理后的图片:

    http://<yourBucketName>.<yourEndpoint>/<yourObjectName>?x-oss-process=image/<yourAction>,<yourParamValue>
    参数 描述
    bucket 存储空间名称
    endpoint 存储空间所在地域的访问域名
    object 图片文件名称
    image 图片处理的保留标志符
    action 对图片做的操作,如缩放、裁剪、旋转等
    param 对图片做的操作所对应的参数
    • 基础操作

      例如,将图缩略成宽度为100,高度按比例处理:

      http://image-demo.oss-cn-hangzhou.aliyuncs.com/example.jpg?x-oss-process=image/resize,w_100
    • 自定义样式

      使用如下格式的三级域名匿名访问图片处理:

      http://<yourBucketName>.<yourEndpoint>/<yourObjectName>?x-oss-process=style/<yourStyleName>
      • style:自定义样式的保留标志符。
      • yourStyleName:自定义样式名称,即通过控制台自定义样式的规则名称。

      例如:

      http://image-demo.oss-cn-hangzhou.aliyuncs.com/example.jpg?x-oss-process=style/oss-pic-style-w-100
    • 级联处理

      通过级联处理,可以对一张图片顺序进行多个操作,格式如下:

      http://<yourBucketName>.<yourEndpoint>/<yourObjectName>?x-oss-process=image/<yourAction1>,<yourParamValue1>/<yourAction2>,<yourParamValue2>/...

      例如:

      http://image-demo.oss-cn-hangzhou.aliyuncs.com/example.jpg?x-oss-process=image/resize,w_100/rotate,90
    • 支持HTTPS访问

      图片服务支持HTTPS访问,例如:

      https://image-demo.oss-cn-hangzhou.aliyuncs.com/example.jpg?x-oss-process=image/resize,w_100
  • 授权访问

    授权访问支持自定义样式、HTTPS和级联处理。

    以下代码用于生成带签名的图片处理URL:

    # -*- coding: utf-8 -*-
    import oss2
    
    # Endpoint以杭州为例,其它Region请按实际情况填写。
    endpoint = 'http://oss-cn-hangzhou.aliyuncs.com'
    # 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
    access_key_id = '<yourAccessKeyId>'
    access_key_secret = '<yourAccessKeySecret>'
    bucket_name = '<yourBucketName>'
    key = 'example.jpg'
    
    # 创建存储空间实例,所有文件相关的方法都需要通过存储空间实例来调用。
    bucket = oss2.Bucket(oss2.Auth(access_key_id, access_key_secret), endpoint, bucket_name)
    
    # 上传示例图片。
    bucket.put_object_from_file(key, 'example.jpg')
    
    # 生成带签名的URL,并指定过期时间为10分钟。过期时间单位是秒。
    style = 'image/resize,m_fixed,w_100,h_100/rotate,90'
    url = bucket.sign_url('GET', key, 10 * 60, params={'x-oss-process': style})
    print(url)
    
  • SDK访问

    对于任意权限的图片文件,都可以直接使用SDK访问和处理。

    SDK处理图片文件支持自定义样式、HTTPS和级联处理。

    • 基础操作

      get_object和get_object_to_file支持图片处理。

      以下代码展示了图片处理的基础操作:

      # -*- coding: utf-8 -*-
      import os
      import oss2
      
      # Endpoint以杭州为例,其它Region请按实际情况填写。
      endpoint = 'http://oss-cn-hangzhou.aliyuncs.com'
      # 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
      access_key_id = '<yourAccessKeyId>'
      access_key_secret = '<yourAccessKeySecret>'
      bucket_name = '<yourBucketName>'
      key = 'example.jpg'
      new_pic = 'example-new.jpg'
      
      # 创建存储空间实例,所有文件相关的方法都需要通过存储空间实例来调用。
      bucket = oss2.Bucket(oss2.Auth(access_key_id, access_key_secret), endpoint, bucket_name)
      
      # 上传示例图片。
      bucket.put_object_from_file(key, 'example.jpg')
      
      # 缩放
      style = 'image/resize,m_fixed,w_100,h_100'
      bucket.get_object_to_file(key, new_pic, process=style)
      
      # 裁剪
      style = 'image/crop,w_100,h_100,x_100,y_100,r_1'
      bucket.get_object_to_file(key, new_pic, process=style)
      
      # 旋转
      style = 'image/rotate,90'
      bucket.get_object_to_file(key, new_pic, process=style)
      
      # 锐化
      style = 'image/sharpen,100'
      bucket.get_object_to_file(key, new_pic, process=style)
      
      # 水印
      style = 'image/watermark,text_SGVsbG8g5Zu-54mH5pyN5YqhIQ'
      bucket.get_object_to_file(key, new_pic, process=style)
      
      # 格式转换
      style = 'image/format,png'
      bucket.get_object_to_file(key, new_pic, process=style)
      
      # 删除示例图片。
      bucket.delete_object(key)
      # 清除本地文件。
      os.remove(new_pic)
      
    • 自定义样式

      以下代码用于自定义图片样式:

      # -*- coding: utf-8 -*-
      import os
      import oss2
      
      # Endpoint以杭州为例,其它Region请按实际情况填写。
      endpoint = 'http://oss-cn-hangzhou.aliyuncs.com'
      # 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
      access_key_id = '<yourAccessKeyId>'
      access_key_secret = '<yourAccessKeySecret>'
      bucket_name = '<yourBucketName>'
      key = 'example.jpg'
      new_pic = 'example-new.jpg'
      
      # 创建存储空间实例,所有文件相关的方法都需要通过存储空间实例来调用。
      bucket = oss2.Bucket(oss2.Auth(access_key_id, access_key_secret), endpoint, bucket_name)
      
      # 上传示例图片。
      bucket.put_object_from_file(key, 'example.jpg')
      
      # 自定义样式。
      style = 'style/oss-pic-style-w-100'
      
      # 图片处理。
      bucket.get_object_to_file(key, new_pic, process=style)
      
      # 删除示例图片。
      bucket.delete_object(key)
      # 清除本地文件。
      os.remove(new_pic)
      
    • 级联处理

      以下代码用于级联处理图片:

      # -*- coding: utf-8 -*-
      import os
      import oss2
      
      # Endpoint以杭州为例,其它Region请按实际情况填写。
      endpoint = 'http://oss-cn-hangzhou.aliyuncs.com'
      # 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
      access_key_id = '<yourAccessKeyId>'
      access_key_secret = '<yourAccessKeySecret>'
      bucket_name = '<yourBucketName>'
      key = 'example.jpg'
      new_pic = 'example-new.jpg'
      
      # 创建存储空间实例,所有文件相关的方法都需要通过存储空间实例来调用。
      bucket = oss2.Bucket(oss2.Auth(access_key_id, access_key_secret), endpoint, bucket_name)
      
      # 上传示例图片。
      bucket.put_object_from_file(key, 'example.jpg')
      
      # 级联处理。
      style = 'image/resize,m_fixed,w_100,h_100/rotate,90'
      
      # 图片处理。
      bucket.get_object_to_file(key, new_pic, process=style)
      
      # 删除示例图片。
      bucket.delete_object(key)
      # 清除本地文件。
      os.remove(new_pic)
      

图片处理持久化

我们提供图片转存的数据处理操作,将处理结果作为资源保存到指定Bucket内,并赋以指定Key。保存成功后,下一次可直接通过指定Bucket来访问该资源,以达到提升下载速度的效果。比较适用于超大图的切割或者其他高延时操作。

以下代码用于图片处理持久化:

# -*- coding: utf-8 -*-
import os
import base64
import oss2

# Endpoint以杭州为例,其它Region请按实际情况填写。
endpoint = 'http://oss-cn-hangzhou.aliyuncs.com'
# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
# source_bucket_name与taget_bucket_name为同一Bucket。 
access_key_id = '<yourAccessKeyId>'
access_key_secret = '<yourAccessKeySecret>'
source_bucket_name = '<yourBucketName>'
taget_bucket_name = '<yourTargetBucketName>'
source_image_name = 'example.jpg'

# 创建存储空间实例,所有文件相关的方法都需要通过存储空间实例来调用。
bucket = oss2.Bucket(oss2.Auth(access_key_id, access_key_secret), endpoint, source_bucket_name)

# 缩放
style = 'image/resize,m_fixed,w_100,h_100'
target_image_name = 'example-resize.jpg'
process = "{0}|sys/saveas,o_{1},b_{2}".format(style, 
    oss2.compat.to_string(base64.urlsafe_b64encode(oss2.compat.to_bytes(target_image_name))),
    oss2.compat.to_string(base64.urlsafe_b64encode(oss2.compat.to_bytes(taget_bucket_name))))
result = bucket.process_object(source_image_name, process)
print(result)

# 裁剪
style = 'image/crop,w_100,h_100,x_100,y_100,r_1'
target_image_name = 'example-crop.jpg'
process = "{0}|sys/saveas,o_{1},b_{2}".format(style, 
    oss2.compat.to_string(base64.urlsafe_b64encode(oss2.compat.to_bytes(target_image_name))),
    oss2.compat.to_string(base64.urlsafe_b64encode(oss2.compat.to_bytes(taget_bucket_name))))
result = bucket.process_object(source_image_name, process)
print(result)

# 旋转
style = 'image/rotate,90'
target_image_name = 'example-rotate.jpg'
process = "{0}|sys/saveas,o_{1},b_{2}".format(style, 
    oss2.compat.to_string(base64.urlsafe_b64encode(oss2.compat.to_bytes(target_image_name))),
    oss2.compat.to_string(base64.urlsafe_b64encode(oss2.compat.to_bytes(taget_bucket_name))))
result = bucket.process_object(source_image_name, process)
print(result)

# 锐化
style = 'image/sharpen,100'
target_image_name = 'example-sharpen.jpg'
process = "{0}|sys/saveas,o_{1},b_{2}".format(style, 
    oss2.compat.to_string(base64.urlsafe_b64encode(oss2.compat.to_bytes(target_image_name))),
    oss2.compat.to_string(base64.urlsafe_b64encode(oss2.compat.to_bytes(taget_bucket_name))))
result = bucket.process_object(source_image_name, process)
print(result)

# 水印
style = 'image/watermark,text_SGVsbG8g5Zu-54mH5pyN5YqhIQ'
target_image_name = 'example-watermark.jpg'
process = "{0}|sys/saveas,o_{1},b_{2}".format(style, 
    oss2.compat.to_string(base64.urlsafe_b64encode(oss2.compat.to_bytes(target_image_name))),
    oss2.compat.to_string(base64.urlsafe_b64encode(oss2.compat.to_bytes(taget_bucket_name))))
result = bucket.process_object(source_image_name, process)
print(result)

# 格式转换
style = 'image/format,png'
target_image_name = 'example-formatconvert.png'
process = "{0}|sys/saveas,o_{1},b_{2}".format(style, 
    oss2.compat.to_string(base64.urlsafe_b64encode(oss2.compat.to_bytes(target_image_name))),
    oss2.compat.to_string(base64.urlsafe_b64encode(oss2.compat.to_bytes(taget_bucket_name))))
result = bucket.process_object(source_image_name, process)
print(result)

图片处理工具

您可以通过可视化图片处理工具ImageStyleViewer直观地看到OSS图片处理结果。