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

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

图片处理功能

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

图片处理使用

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

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

  • 匿名访问
    您可以通过如下格式的三级域名匿名访问处理后的图片:
  1. http://<yourBucketName>.<yourEndpoint>/<yourObjectName>?x-oss-process=image/<yourAction>,<yourParamValue>

参数描述bucket存储空间名称endpoint存储空间所在地域的访问域名object图片文件名称image图片处理的保留标志符action对图片做的操作,如缩放、裁剪、旋转等param对图片做的操作所对应的参数

  • 基础操作
    例如,将图缩略成宽度为100,高度按比例处理:
  1. http://image-demo.oss-cn-hangzhou.aliyuncs.com/example.jpg?x-oss-process=image/resize,w_100
  • 自定义样式
    使用如下格式的三级域名匿名访问图片处理:
  1. http://<yourBucketName>.<yourEndpoint>/<yourObjectName>?x-oss-process=style/<yourStyleName>
  1. - style:自定义样式的保留标志符。
  2. - yourStyleName:自定义样式名称,即通过控制台自定义样式的规则名称。

例如:

  1. http://image-demo.oss-cn-hangzhou.aliyuncs.com/example.jpg?x-oss-process=style/oss-pic-style-w-100
  • 级联处理
    通过级联处理,可以对一张图片顺序进行多个操作,格式如下:
  1. http://<yourBucketName>.<yourEndpoint>/<yourObjectName>?x-oss-process=image/<yourAction1>,<yourParamValue1>/<yourAction2>,<yourParamValue2>/...

例如:

  1. http://image-demo.oss-cn-hangzhou.aliyuncs.com/example.jpg?x-oss-process=image/resize,w_100/rotate,90
  • 支持HTTPS访问
    图片服务支持HTTPS访问,例如:
  1. https://image-demo.oss-cn-hangzhou.aliyuncs.com/example.jpg?x-oss-process=image/resize,w_100
  • 授权访问
    授权访问支持自定义样式、HTTPS和级联处理。

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

  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "github.com/aliyun/aliyun-oss-go-sdk/oss"
  6. )
  7. func HandleError(err error) {
  8. fmt.Println("Error:", err)
  9. os.Exit(-1)
  10. }
  11. func main() {
  12. // 创建OSSClient实例。
  13. client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
  14. if err != nil {
  15. HandleError(err)
  16. }
  17. // 获取存储空间。
  18. bucketName := "<yourBucketName>"
  19. bucket, err := client.Bucket(bucketName)
  20. if err != nil {
  21. HandleError(err)
  22. }
  23. ossImageName := "<yourImageName>"
  24. signedURL, err := bucket.SignURL(ossImageName, oss.HTTPGet, 600, oss.Process("image/format,png"))
  25. if err != nil {
  26. HandleError(err)
  27. } else {
  28. fmt.Println(signedURL)
  29. }
  30. }
  • SDK访问
    对于任意权限的图片文件,都可以直接使用SDK访问和处理。

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

  • 基础操作
    以下代码展示了图片处理的基础操作:
  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "github.com/aliyun/aliyun-oss-go-sdk/oss"
  6. )
  7. func HandleError(err error) {
  8. fmt.Println("Error:", err)
  9. os.Exit(-1)
  10. }
  11. func main() {
  12. // 创建OSSClient实例。
  13. client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
  14. if err != nil {
  15. HandleError(err)
  16. }
  17. // 获取存储空间。
  18. bucketName := "<yourBucketName>"
  19. bucket, err := client.Bucket(bucketName)
  20. if err != nil {
  21. HandleError(err)
  22. }
  23. // 图片处理:缩放。
  24. sourceImageName := "example.png"
  25. targetImageName := "example-resize.png"
  26. style := "image/resize,m_fixed,w_100,h_100"
  27. err = bucket.GetObjectToFile(sourceImageName, targetImageName, oss.Process(style))
  28. if err != nil {
  29. HandleError(err)
  30. }
  31. // 图片处理:裁剪。
  32. targetImageName = "example-crop.png"
  33. style = "image/crop,w_100,h_100,x_100,y_100,r_1"
  34. err = bucket.GetObjectToFile(sourceImageName, targetImageName, oss.Process(style))
  35. if err != nil {
  36. HandleError(err)
  37. }
  38. // 图片处理:旋转。
  39. targetImageName = "example-rotate.png"
  40. style = "image/rotate,90"
  41. err = bucket.GetObjectToFile(sourceImageName, targetImageName, oss.Process(style))
  42. if err != nil {
  43. HandleError(err)
  44. }
  45. // 图片处理:锐化。
  46. targetImageName = "example-sharpen.png"
  47. style = "image/sharpen,100"
  48. err = bucket.GetObjectToFile(sourceImageName, targetImageName, oss.Process(style))
  49. if err != nil {
  50. HandleError(err)
  51. }
  52. // 图片处理:水印。
  53. targetImageName = "example-watermark.png"
  54. style = "image/watermark,text_SGVsbG8g5Zu-54mH5pyN5YqhIQ"
  55. err = bucket.GetObjectToFile(sourceImageName, targetImageName, oss.Process(style))
  56. if err != nil {
  57. HandleError(err)
  58. }
  59. // 图片处理:格式转换。
  60. targetImageName = "example-formatconvert.jpg"
  61. style = "image/format,jpg"
  62. err = bucket.GetObjectToFile(sourceImageName, targetImageName, oss.Process(style))
  63. if err != nil {
  64. HandleError(err)
  65. }
  66. }
  • 自定义样式
    以下代码用于自定义图片样式:
  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "github.com/aliyun/aliyun-oss-go-sdk/oss"
  6. )
  7. func HandleError(err error) {
  8. fmt.Println("Error:", err)
  9. os.Exit(-1)
  10. }
  11. func main() {
  12. // 创建OSSClient实例。
  13. client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
  14. if err != nil {
  15. HandleError(err)
  16. }
  17. // 获取存储空间。
  18. bucketName := "<yourBucketName>"
  19. bucket, err := client.Bucket(bucketName)
  20. if err != nil {
  21. HandleError(err)
  22. }
  23. // 图片处理:自定义样式。
  24. sourceImageName := "example.png"
  25. targetImageName := "example-custom.png"
  26. style := "style/<yourCustomStyleName>"
  27. err = bucket.GetObjectToFile(sourceImageName, targetImageName, oss.Process(style))
  28. if err != nil {
  29. HandleError(err)
  30. }
  31. }
  • 级联处理
    以下代码用于级联处理图片:
  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "github.com/aliyun/aliyun-oss-go-sdk/oss"
  6. )
  7. func HandleError(err error) {
  8. fmt.Println("Error:", err)
  9. os.Exit(-1)
  10. }
  11. func main() {
  12. // 创建OSSClient实例。
  13. client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
  14. if err != nil {
  15. HandleError(err)
  16. }
  17. // 获取存储空间。
  18. bucketName := "<yourBucketName>"
  19. bucket, err := client.Bucket(bucketName)
  20. if err != nil {
  21. HandleError(err)
  22. }
  23. // 图片处理:自定义样式。
  24. sourceImageName := "example.png"
  25. targetImageName := "example-cascade.png"
  26. style := "image/resize,m_fixed,w_100,h_100/rotate,90"
  27. err = bucket.GetObjectToFile(sourceImageName, targetImageName, oss.Process(style))
  28. if err != nil {
  29. HandleError(err)
  30. }
  31. }

图片处理持久化

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

  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "encoding/base64"
  6. "github.com/aliyun/aliyun-oss-go-sdk/oss"
  7. )
  8. func HandleError(err error) {
  9. fmt.Println("Error:", err)
  10. os.Exit(-1)
  11. }
  12. func main() {
  13. // 创建OSSClient实例。
  14. client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
  15. if err != nil {
  16. HandleError(err)
  17. }
  18. // 获取存储空间。
  19. bucketName := "<yourBucketName>"
  20. bucket, err := client.Bucket(bucketName)
  21. if err != nil {
  22. HandleError(err)
  23. }
  24. // 图片处理持久化:缩放。目标图片默认会存放到相同的bucket中。
  25. sourceImageName := "example.png"
  26. targetImageName := "example-resize.png"
  27. style := "image/resize,m_fixed,w_100,h_100"
  28. process := fmt.Sprintf("%s|sys/saveas,o_%v", style, base64.URLEncoding.EncodeToString([]byte(targetImageName)))
  29. result, err := bucket.ProcessObject(sourceImageName, process)
  30. if err != nil {
  31. HandleError(err)
  32. } else {
  33. fmt.Println(result)
  34. }
  35. // 图片处理持久化:缩放。将目标图片存放到不同的bucket中。
  36. targetBucketName := "<yourTargetBucketName>"
  37. targetImageName = "example-crop-different-bucket.png"
  38. style = "image/resize,m_fixed,w_100,h_100"
  39. process = fmt.Sprintf("%s|sys/saveas,o_%v,b_%v", style, base64.URLEncoding.EncodeToString([]byte(targetImageName)), base64.URLEncoding.EncodeToString([]byte(targetBucketName)))
  40. result, err = bucket.ProcessObject(sourceImageName, process)
  41. if err != nil {
  42. HandleError(err)
  43. } else {
  44. fmt.Println(result)
  45. }
  46. // 图片处理持久化:裁剪。
  47. targetImageName = "example-crop.png"
  48. style = "image/crop,w_100,h_100,x_100,y_100,r_1"
  49. process = fmt.Sprintf("%s|sys/saveas,o_%v", style, base64.URLEncoding.EncodeToString([]byte(targetImageName)))
  50. result, err = bucket.ProcessObject(sourceImageName, process)
  51. if err != nil {
  52. HandleError(err)
  53. } else {
  54. fmt.Println(result)
  55. }
  56. // 图片处理持久化:旋转。
  57. targetImageName = "example-rotate.png"
  58. style = "image/rotate,90"
  59. process = fmt.Sprintf("%s|sys/saveas,o_%v", style, base64.URLEncoding.EncodeToString([]byte(targetImageName)))
  60. result, err = bucket.ProcessObject(sourceImageName, process)
  61. if err != nil {
  62. HandleError(err)
  63. } else {
  64. fmt.Println(result)
  65. }
  66. // 图片处理持久化:锐化。
  67. targetImageName = "example-sharpen.png"
  68. style = "image/sharpen,100"
  69. process = fmt.Sprintf("%s|sys/saveas,o_%v", style, base64.URLEncoding.EncodeToString([]byte(targetImageName)))
  70. result, err = bucket.ProcessObject(sourceImageName, process)
  71. if err != nil {
  72. HandleError(err)
  73. } else {
  74. fmt.Println(result)
  75. }
  76. // 图片处理持久化:水印。
  77. targetImageName = "example-watermark.png"
  78. style = "image/watermark,text_SGVsbG8g5Zu-54mH5pyN5YqhIQ"
  79. process = fmt.Sprintf("%s|sys/saveas,o_%v", style, base64.URLEncoding.EncodeToString([]byte(targetImageName)))
  80. result, err = bucket.ProcessObject(sourceImageName, process)
  81. if err != nil {
  82. HandleError(err)
  83. } else {
  84. fmt.Println(result)
  85. }
  86. // 图片处理持久化:格式转换。
  87. targetImageName = "example-formatconvert.jpg"
  88. style = "image/format,jpg"
  89. process = fmt.Sprintf("%s|sys/saveas,o_%v", style, base64.URLEncoding.EncodeToString([]byte(targetImageName)))
  90. result, err = bucket.ProcessObject(sourceImageName, process)
  91. if err != nil {
  92. HandleError(err)
  93. } else {
  94. fmt.Println(result)
  95. }
  96. }

图片处理工具

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