Image Processing (IMG) は、大規模で安全、低コストで、信頼性の高い画像処理サービスです。 ソースイメージを OSS にアップロードすることで、簡単な RESTful API を通じて、いつでも、どこでも、どんなインターネットデバイスでも画像を処理できます。

IMG の詳細については、「Image Processing」をご参照ください。

画像処理の基本機能

OSS は以下の画像処理機能を提供します。

画像処理の使用方法

IMG は標準の HTTP GET を使用します。 URL の QueryString に IMG パラメーターを設定します。

イメージ オブジェクトの ACL が非公開読み書きの場合、許可されたユーザーだけがアクセスを許可されます。

  • 匿名アクセス

    処理済みイメージにアクセスするには、次の形式の第 3 レベルドメインを使用します。

    http://<yourBucketName>.<yourEndpoint>/<yourObjectName>?x-oss-process=image/<yourAction>,<yourParamValue>
    パラメーター 説明
    bucket バケットの名前を指定します。
    endpoint リージョンへのアクセスに使用されるエンドポイントを指定します。
    object 画像オブジェクトの名前を指定します。
    image IMGの予約済み識別子を指定します。
    action 拡大縮小、トリミング、回転など、画像に対する操作を指定します。
    param 画像に対する操作を示すパラメーターを指定します。
    • 基本操作

      たとえば、画像を 100 ピクセルの幅に拡大縮小します。 比率に基づいて高さを調整します。

      http://image-demo.oss-cn-hangzhou.aliyuncs.com/example.jpg?x-oss-process=image/resize,w_100
    • カスタマイズされたイメージスタイル

      処理済みイメージにアクセスするには、次の形式の第 3 レベルドメインを使用します。

      http://<yourBucketName>.<yourEndpoint>/<yourObjectName>?x-oss-process=style/<yourStyleName>
      • style: カスタマイズされたイメージスタイルの予約済み識別子を指定します。
      • yourStyleName: カスタムイメージスタイルの名前を指定します。 OSS コンソールで作成されたルールで指定された名前です。

      例:

      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 アクセス

      IMG は HTTPS を通じたアクセスをサポートしています。 例:

      https://image-demo.oss-cn-hangzhou.aliyuncs.com/example.jpg?x-oss-process=image/resize,w_100
  • 許可されたアクセス

    アクセス許可により、イメージスタイル、HTTPS アクセス、およびカスケード処理をカスタマイズできます。

    次のコードを使用して IMG の署名付き 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() {
        // Create an OSSClient instance.
        client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
        if err ! = nil {
    	HandleError(err)
        }
    	
        // Obtain the bucket.
        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() {
          // Create an OSSClient instance.
          client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
          if err ! = nil {
      	HandleError(err)
          }
      	
          // Obtain the bucket.
          bucketName := "<yourBucketName>"
          bucket, err := client.Bucket(bucketName)
          if err ! = nil {
      	HandleError(err)
          }
      
          // Scale the image.
          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)
          }
          
          // Crop the image.
          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)
          }
          
          // Rotate the image.
          targetImageName = "example-rotate.png"
          style = "image/rotate,90"
          err = bucket.GetObjectToFile(sourceImageName, targetImageName, oss.Process(style))
          if err ! = nil {
      	HandleError(err)
          }
          
          // Sharpen the image.
          targetImageName = "example-sharpen.png"
          style = "image/sharpen,100"
          err = bucket.GetObjectToFile(sourceImageName, targetImageName, oss.Process(style))
          if err ! = nil {
      	HandleError(err)
          }
          
          // Add watermarks.
          targetImageName = "example-watermark.png"
          style = "image/watermark,text_SGVsbG8g5Zu-54mH5pyN5YqhIQ"
          err = bucket.GetObjectToFile(sourceImageName, targetImageName, oss.Process(style))
          if err ! = nil {
      	HandleError(err)
          }
          
          // Convert the image format.
          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() {
          // Create an OSSClient instance.
          client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
          if err ! = nil {
      	HandleError(err)
          }
      	
          // Obtain the bucket.
          bucketName := "<yourBucketName>"
          bucket, err := client.Bucket(bucketName)
          if err ! = nil {
      	 HandleError(err)
          }
      
          // Customize the image style.
          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() {
          // Create an OSSClient instance.
          client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
          if err ! = nil {
      	HandleError(err)
          }
      	
          // Obtain the bucket.
          bucketName := "<yourBucketName>"
          bucket, err := client.Bucket(bucketName)
          if err ! = nil {
      	HandleError(err)
           }
      
          // Customize an image style.
          sourceImageName := "example.png"
          targetImageName := "example-resize.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() {
    // Create an OSSClient instance.
    client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
    if err ! = nil {
	HandleError(err)
    }    
    
    // Obtain the bucket.
    bucketName := "<yourBucketName>"
    bucket, err := client.Bucket(bucketName)
    if err ! = nil {
	 HandleError(err)
    }


    // Image processing persistence: Scale the image. The target image is stored in the same bucket by default.
    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)
    }
   
    // Image processing persistence: Scale the image. The target image is stored in the different 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)
    }
    
    // Image processing persistence: Crop the image.
    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)
    }
    
    // Image processing persistence: Rotate the image.
    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)
    }
    
    // Image processing persistence: Sharpen the image.
    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)
    }
    
    // Image processing persistence: Add watermarks.
    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)
    }
    
    // Image processing persistence: Covert the image format.
    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)
    }
}