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

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

图片处理功能

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:

    package main
    
    import (
        "fmt"
        "os"
        "github.com/aliyun/aliyun-oss-go-sdk/oss"
    )
    
    func HandleError(err error) {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }
    
    func main() {
        // 创建OSSClient实例。
        client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
        if err != nil {
    	HandleError(err)
        }
    	
        // 获取存储空间。
        bucketName := "<yourBucketName>"
        bucket, err := client.Bucket(bucketName)
        if err != nil {
    	HandleError(err)
        }
    
        ossImageName := "<yourImageName>"
        signedURL, err := bucket.SignURL(ossImageName, oss.HTTPGet, 600, oss.Process("image/format,png"))
        if err != nil {
    	HandleError(err)
        } else {
    	fmt.Println(signedURL)
        }
    }
  • SDK访问

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

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

    • 基础操作

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

      package main
      
      import (
          "fmt"
          "os"
          "github.com/aliyun/aliyun-oss-go-sdk/oss"
      )
      
      func HandleError(err error) {
          fmt.Println("Error:", err)
          os.Exit(-1)
      }
      
      func main() {
          // 创建OSSClient实例。
          client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
          if err != nil {
      	HandleError(err)
          }
      	
          // 获取存储空间。
          bucketName := "<yourBucketName>"
          bucket, err := client.Bucket(bucketName)
          if err != nil {
      	HandleError(err)
          }
      
          // 图片处理:缩放。
          sourceImageName := "example.png"
          targetImageName := "example-resize.png"
          style := "image/resize,m_fixed,w_100,h_100"
          err = bucket.GetObjectToFile(sourceImageName, targetImageName, oss.Process(style))
          if err != nil {
      	HandleError(err)
          }
          
          // 图片处理:裁剪。
          targetImageName = "example-crop.png"
          style = "image/crop,w_100,h_100,x_100,y_100,r_1"
          err = bucket.GetObjectToFile(sourceImageName, targetImageName, oss.Process(style))
          if err != nil {
      	HandleError(err)
          }
          
          // 图片处理:旋转。
          targetImageName = "example-rotate.png"
          style = "image/rotate,90"
          err = bucket.GetObjectToFile(sourceImageName, targetImageName, oss.Process(style))
          if err != nil {
      	HandleError(err)
          }
          
          // 图片处理:锐化。
          targetImageName = "example-sharpen.png"
          style = "image/sharpen,100"
          err = bucket.GetObjectToFile(sourceImageName, targetImageName, oss.Process(style))
          if err != nil {
      	HandleError(err)
          }
          
          // 图片处理:水印。
          targetImageName = "example-watermark.png"
          style = "image/watermark,text_SGVsbG8g5Zu-54mH5pyN5YqhIQ"
          err = bucket.GetObjectToFile(sourceImageName, targetImageName, oss.Process(style))
          if err != nil {
      	HandleError(err)
          }
          
          // 图片处理:格式转换。
          targetImageName = "example-formatconvert.jpg"
          style = "image/format,jpg"
          err = bucket.GetObjectToFile(sourceImageName, targetImageName, oss.Process(style))
          if err != nil {
      	HandleError(err)
          }
      }
    • 自定义样式

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

      package main
      
      import (
          "fmt"
          "os"
          "github.com/aliyun/aliyun-oss-go-sdk/oss"
      )
      
      func HandleError(err error) {
          fmt.Println("Error:", err)
          os.Exit(-1)
      }
      
      func main() {
          // 创建OSSClient实例。
          client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
          if err != nil {
      	HandleError(err)
          }
      	
          // 获取存储空间。
          bucketName := "<yourBucketName>"
          bucket, err := client.Bucket(bucketName)
          if err != nil {
      	 HandleError(err)
          }
      
          // 图片处理:自定义样式。
          sourceImageName := "example.png"
          targetImageName := "example-custom.png"
          style := "style/<yourCustomStyleName>"
          err = bucket.GetObjectToFile(sourceImageName, targetImageName, oss.Process(style))
          if err != nil {
      	HandleError(err)
          }
      }
    • 级联处理

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

      package main
      
      import (
          "fmt"
          "os"
          "github.com/aliyun/aliyun-oss-go-sdk/oss"
      )
      
      func HandleError(err error) {
          fmt.Println("Error:", err)
          os.Exit(-1)
      }
      
      func main() {
          // 创建OSSClient实例。
          client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
          if err != nil {
      	HandleError(err)
          }
      	
          // 获取存储空间。
          bucketName := "<yourBucketName>"
          bucket, err := client.Bucket(bucketName)
          if err != nil {
      	HandleError(err)
           }
      
          // 图片处理:自定义样式。
          sourceImageName := "example.png"
          targetImageName := "example-cascade.png"
          style := "image/resize,m_fixed,w_100,h_100/rotate,90"
          err = bucket.GetObjectToFile(sourceImageName, targetImageName, oss.Process(style))
          if err != nil {
      	 HandleError(err)
          }
      }

图片处理持久化

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

import (
    "fmt"
    "os"
    "encoding/base64"
    "github.com/aliyun/aliyun-oss-go-sdk/oss"
)

func HandleError(err error) {
    fmt.Println("Error:", err)
    os.Exit(-1)
}

func main() {
    // 创建OSSClient实例。
    client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
    if err != nil {
	HandleError(err)
    }    
    
    // 获取存储空间。
    bucketName := "<yourBucketName>"
    bucket, err := client.Bucket(bucketName)
    if err != nil {
	 HandleError(err)
    }


    // 图片处理持久化:缩放。目标图片默认会存放到相同的bucket中。
    sourceImageName := "example.png"
    targetImageName := "example-resize.png"
    style := "image/resize,m_fixed,w_100,h_100"
    process := fmt.Sprintf("%s|sys/saveas,o_%v", style, base64.URLEncoding.EncodeToString([]byte(targetImageName)))
    result, err := bucket.ProcessObject(sourceImageName, process)
    if err != nil {
	HandleError(err)
    } else {
        fmt.Println(result)
    }
   
    // 图片处理持久化:缩放。将目标图片存放到不同的bucket中。
    targetBucketName := "<yourTargetBucketName>"
    targetImageName = "example-crop-different-bucket.png"
    style = "image/resize,m_fixed,w_100,h_100"
    process = fmt.Sprintf("%s|sys/saveas,o_%v,b_%v", style, base64.URLEncoding.EncodeToString([]byte(targetImageName)), base64.URLEncoding.EncodeToString([]byte(targetBucketName)))
    result, err = bucket.ProcessObject(sourceImageName, process)
    if err != nil {
	HandleError(err)
    } else {
        fmt.Println(result)
    }
    
    // 图片处理持久化:裁剪。
    targetImageName = "example-crop.png"
    style = "image/crop,w_100,h_100,x_100,y_100,r_1"
    process = fmt.Sprintf("%s|sys/saveas,o_%v", style, base64.URLEncoding.EncodeToString([]byte(targetImageName)))
    result, err = bucket.ProcessObject(sourceImageName, process)
    if err != nil {
	HandleError(err)
    } else {
        fmt.Println(result)
    }
    
    // 图片处理持久化:旋转。
    targetImageName = "example-rotate.png"
    style = "image/rotate,90"
    process = fmt.Sprintf("%s|sys/saveas,o_%v", style, base64.URLEncoding.EncodeToString([]byte(targetImageName)))
    result, err = bucket.ProcessObject(sourceImageName, process)
    if err != nil {
	HandleError(err)
    } else {
        fmt.Println(result)
    }
    
    // 图片处理持久化:锐化。
    targetImageName = "example-sharpen.png"
    style = "image/sharpen,100"
    process = fmt.Sprintf("%s|sys/saveas,o_%v", style, base64.URLEncoding.EncodeToString([]byte(targetImageName)))
    result, err = bucket.ProcessObject(sourceImageName, process)
    if err != nil {
	HandleError(err)
    } else {
       fmt.Println(result)
    }
    
    // 图片处理持久化:水印。
    targetImageName = "example-watermark.png"
    style = "image/watermark,text_SGVsbG8g5Zu-54mH5pyN5YqhIQ"
    process = fmt.Sprintf("%s|sys/saveas,o_%v", style, base64.URLEncoding.EncodeToString([]byte(targetImageName)))
    result, err = bucket.ProcessObject(sourceImageName, process)
    if err != nil {
	HandleError(err)
    } else {
        fmt.Println(result)
    }
    
    // 图片处理持久化:格式转换。
    targetImageName = "example-formatconvert.jpg"
    style = "image/format,jpg"
    process = fmt.Sprintf("%s|sys/saveas,o_%v", style, base64.URLEncoding.EncodeToString([]byte(targetImageName)))
    result, err = bucket.ProcessObject(sourceImageName, process)
    if err != nil {
	HandleError(err)
    } else {
        fmt.Println(result)
    }
}