すべてのプロダクト
Search
ドキュメントセンター

Object Storage Service:処理済み画像の保存

最終更新日:Sep 02, 2026

デフォルトでは、Object Storage Service (OSS) は画像処理 (IMG) リクエストのパラメーターに基づいてソース画像を処理しますが、処理済み画像は保存しません。サムネイル、クロップされた画像、フォーマット変換された画像など、同じ処理結果を繰り返し利用したい場合は、処理済み画像を保存できます。処理済み画像をオブジェクトとして特定のバケットに保存するには、IMG リクエストに saveas パラメーターを追加する必要があります。

注意事項

  • 必要な権限

    処理済みの画像を保存するには、ソースバケットに対するoss:PostProcessTask権限、宛先バケットに対するoss:PutBucket権限、および宛先オブジェクトに対するoss:PutObject権限が必要です。

  • ストレージリージョン

    処理済み画像は、ソース画像と同じバケット、または別のバケットに保存できます。ただし、ソースバケットと送信先バケットは、同じ Alibaba Cloud アカウントに属し、同じリージョンにある必要があります。

  • 保存方法

    SDK を使用して処理済み画像を保存する場合、データは OSS サーバーサイドで処理され、処理済み画像が指定したバケットに直接書き込まれます。画像をローカルデバイスにダウンロードして再度アップロードする必要はありません。SDK を使用して処理した画像を指定したバケットに保存するには、saveas パラメーターを追加します。詳細については、「Alibaba Cloud SDKを使用した処理済み画像の保存例」をご参照ください。なお、ファイルURLの処理結果を指定したバケットに直接保存することはサポートされていません。処理済み画像をローカルデバイスに保存してから、指定したバケットにアップロードすることを推奨します。

  • ACL

    処理済み画像のアクセス制御リスト (ACL) は、画像の保存先バケットの ACL と同じで、カスタマイズはできません。

  • 保存期間

    処理済み画像の保存期間を調整する場合は、ライフサイクルルールを使用して適切な有効期限ポリシーを設定してください。

操作

Alibaba Cloud SDKの使用

次のコードは、主要なプログラミング言語向けの OSS SDK を使用して処理済み画像を保存する例です。他の SDK を使用して処理済み画像を保存する方法の詳細については、「SDKの概要」をご参照ください。

import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.common.utils.BinaryUtil;
import com.aliyun.oss.common.utils.IOUtils;
import com.aliyun.oss.model.GenericResult;
import com.aliyun.oss.model.ProcessObjectRequest;
import java.util.Formatter;

public class Demo {
    public static void main(String[] args) throws Throwable {
        // この例では、中国 (杭州) リージョンのエンドポイントを使用します。 実際のエンドポイントに置き換えてください。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 環境変数からアクセス認証情報を取得します。 このサンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // バケット名を設定します。 例: examplebucket。
        String bucketName = "examplebucket";
        // オブジェクトの完全なパスを設定します。 完全なパスにバケット名を含めることはできません。
        String sourceImage = "exampleimage.png";
        // バケットが配置されているリージョンを設定します。 たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。
        String region = "cn-hangzhou";

        // OSSClient インスタンスを作成します。
        // OSSClient インスタンスが不要になったら、シャットダウンメソッドを呼び出してリソースを解放します。
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);        
        OSS ossClient = OSSClientBuilder.create()
        .endpoint(endpoint)
        .credentialsProvider(credentialsProvider)
        .clientConfiguration(clientBuilderConfiguration)
        .region(region)               
        .build();

        try {
            // イメージを幅と高さが 100 px の固定サイズに変更します。
            StringBuilder sbStyle = new StringBuilder();
            Formatter styleFormatter = new Formatter(sbStyle);
            String styleType = "image/resize,m_fixed,w_100,h_100";
            // 処理されたイメージに example-resize.png という名前を付け、現在のバケットに保存します。
            // オブジェクトの完全なパスを設定します。 完全なパスにバケット名を含めることはできません。
            String targetImage = "example-resize.png";
            styleFormatter.format("%s|sys/saveas,o_%s,b_%s", styleType,
                    BinaryUtil.toBase64String(targetImage.getBytes()),
                    BinaryUtil.toBase64String(bucketName.getBytes()));
            System.out.println(sbStyle.toString());
            ProcessObjectRequest request = new ProcessObjectRequest(bucketName, sourceImage, sbStyle.toString());
            GenericResult processResult = ossClient.processObject(request);
            String json = IOUtils.readStreamAsString(processResult.getResponse().getContent(), "UTF-8");
            processResult.getResponse().getContent().close();
            System.out.println(json);
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}
<?php
if (is_file(__DIR__ . '/../autoload.php')) {
    require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__ . '/../vendor/autoload.php')) {
    require_once __DIR__ . '/../vendor/autoload.php';
}
use OSS\Credentials\EnvironmentVariableCredentialsProvider;
use OSS\OssClient;

// 環境変数からアクセス認証情報を取得します。このサンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
$provider = new EnvironmentVariableCredentialsProvider();
// yourEndpoint を、バケットが所在するリージョンのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
$endpoint = "yourEndpoint";
// バケット名を設定します。例:examplebucket。
$bucket= "examplebucket";
// ソースオブジェクトの完全なパスを設定します。例:exampledir/exampleobject.jpg。完全なパスにバケット名を含めることはできません。
$object = "exampledir/exampleobject.jpg";
// 宛先オブジェクトの完全なパスを設定します。例:example-new.jpg。
$save_object = "example-new.jpg";

function base64url_encode($data)
{
    return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}

$config = array(
        "provider" => $provider,
        "endpoint" => $endpoint,
        "signatureVersion" => OssClient::OSS_SIGNATURE_VERSION_V4,
        "region"=> "cn-hangzhou"
    );
    $ossClient = new OssClient($config);
// ソースイメージが指定されたバケットにない場合は、イメージをバケットにアップロードします。
// $ossClient->uploadFile($bucket, $object, "D:\\localpath\\exampleobject.jpg");

// イメージを幅と高さが 100 px の固定サイズに変更し、90 度回転させます。
$style = "image/resize,m_fixed,w_100,h_100/rotate,90";

$process = $style.
           '|sys/saveas'.
           ',o_'.base64url_encode($save_object).
           ',b_'.base64url_encode($bucket);

// 処理後のイメージを example-new.png という名前で現在のバケットに保存します。
$result = $ossClient->processObject($bucket, $object, $process);
// 処理結果を出力します。
print($result);
const OSS = require('ali-oss');

const client = new OSS({
  // バケットがあるリージョンを指定します。たとえば、バケットが China (Hangzhou) リージョンにある場合は、region を oss-cn-hangzhou に設定します。
  region: 'yourregion',
  // 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
  accessKeyId: process.env.OSS_ACCESS_KEY_ID,
  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
  authorizationV4: true,
  // バケット名を指定します。
  bucket: 'yourbucketname'
});

const sourceImage = 'sourceObject.png';
const targetImage = 'targetObject.jpg';
async function processImage(processStr, targetBucket) {
  const result = await client.processObjectSave(
    sourceImage,
    targetImage,
    processStr,
    targetBucket
  );
  console.log(result.res.status);
}

// 画像をリサイズし、処理済み画像の保存先バケットを設定します。
processImage("image/resize,m_fixed,w_100,h_100", "target bucket")

// 画像をクロップし、処理済み画像の保存先バケットを設定します。
processImage("image/crop,w_100,h_100,x_100,y_100,r_1", "target bucket")

// 画像を回転させ、処理済み画像の保存先バケットを設定します。
processImage("image/rotate,90", "target bucket")

// 画像をシャープにし、処理済み画像の保存先バケットを設定します。
processImage("image/sharpen,100", "target bucket")

// 画像にウォーターマークを追加し、処理済み画像の保存先バケットを設定します。
processImage("image/watermark,text_SGVsbG8g5Zu-54mH5pyN5YqhIQ", "target bucket")

// 画像のフォーマットを変換し、処理済み画像の保存先バケットを設定します。
processImage("image/format,jpg", "target bucket")
# -*- coding: utf-8 -*-
import os
import base64
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider

# 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、環境変数 OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET が設定されていることを確認してください。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())

# バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# cn-hangzhou など、バケットが配置されているリージョンを指定します。このパラメーターは V4 署名に必要です。
region = "cn-hangzhou"

# examplebucket をご使用のバケットの名前に設定します。
bucket = oss2.Bucket(auth, endpoint, "examplebucket", region=region)

# ソースイメージが格納されているバケットの名前を指定します。
source_bucket_name = 'srcbucket'
# 処理後のイメージを格納するバケットの名前を指定します。このバケットは、ソースバケットと同じリージョンにある必要があります。
target_bucket_name = 'destbucket'
# ソースイメージの名前を指定します。イメージがバケットのルートディレクトリにない場合は、example/example.jpg のようにファイルの完全なパスを指定する必要があります。
source_image_name = 'example/example.jpg'

# イメージの幅と高さを 100 px に固定してサイズ変更します。
style = 'image/resize,m_fixed,w_100,h_100'
# 処理後のイメージの名前を指定します。イメージがバケットのルートディレクトリにない場合は、exampledir/example.jpg のようにファイルの完全なパスを指定する必要があります。
target_image_name = 'exampledir/example.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(target_bucket_name))))
result = bucket.process_object(source_image_name, process)
print(result)
// fromBucket と toBucket は、ソースバケット名と宛先バケット名を表します。
// fromObjectKey と toObjectKey は、ソースオブジェクト名と宛先オブジェクト名を表します。名前は拡張子を含む完全なパスである必要があります (例:abc/efg/123.jpg)。
// action は画像処理操作を表します (例:"image/resize,m_lfit,w_100,h_100")。
ImagePersistRequest request = new ImagePersistRequest(fromBucket,fromObjectKey,toBucket,toObjectKey,action);

        OSSAsyncTask task = oss.asyncImagePersist(request, new OSSCompletedCallback<ImagePersistRequest, ImagePersistResult>() {
            @Override
            public void onSuccess(ImagePersistRequest request, ImagePersistResult result) {
                // 成功コールバック
                log.i("info", "Success");
            }

            @Override
            public void onFailure(ImagePersistRequest request, ClientException clientException, ServiceException serviceException) {
              // リクエストは失敗しました。
              if (clientException != null) {
                  // クライアント側の例外が発生しました (例:ネットワークエラー)。
                  clientException.printStackTrace();
              }
              if (serviceException != null) {
                  // サーバー側の例外が発生しました。
                  Log.e("ErrorCode", serviceException.getErrorCode());
                  Log.e("RequestId", serviceException.getRequestId());
                  Log.e("HostId", serviceException.getHostId());
                  Log.e("RawMessage", serviceException.getRawMessage());
              }
            }
        });
package main

import (
	"encoding/base64"
	"fmt"
	"os"

	"github.com/aliyun/aliyun-oss-go-sdk/oss"
)

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

func main() {
	// 環境変数からアクセス認証情報を取得します。 このサンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}

	// OSSClient インスタンスを作成します。
	// yourEndpoint をバケットのエンドポイントに設定します。 たとえば、中国 (杭州) リージョンのバケットの場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 他のリージョンについては、実際のエンドポイントを使用します。
	// yourRegion をバケットが配置されているリージョンに設定します。 たとえば、中国 (杭州) リージョンのバケットの場合、リージョンを cn-hangzhou に設定します。 他のリージョンについては、実際のリージョンを使用します。
	clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
	clientOptions = append(clientOptions, oss.Region("yourRegion"))
	// 署名バージョンを設定します。
	clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
	client, err := oss.New("yourEndpoint", "", "", clientOptions...)
	if err != nil {
		HandleError(err)
	}

	// ソースイメージが格納されているバケットの名前 (srcbucket など) を指定します。
	bucketName := "SourceBucketName"
	bucket, err := client.Bucket(bucketName)
	if err != nil {
		HandleError(err)
	}
	// ソースイメージの名前を指定します。 イメージがバケットのルートディレクトリにない場合は、example/example.jpg などのファイルの完全なパスを含めます。
	sourceImageName := "yourObjectName"
	// 処理されたイメージを格納するバケットの名前を指定します。 このバケットは、ソースバケットと同じリージョンにある必要があります。
	targetBucketName := "TargetBucketName"
	// 処理されたイメージの名前を指定します。 イメージがバケットのルートディレクトリにない場合は、exampledir/example.jpg などのファイルの完全なアクセスパスを含めます。
	targetImageName := "TargetObjectName"
	// イメージのサイズを幅と高さが 100 px の固定値に変更し、指定したバケットに保存します。
	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)
	}
}
OSSImagePersistRequest *request = [OSSImagePersistRequest new];
// ソース画像が保存されているバケットの名前を指定します。
request.fromBucket = @"srcbucket";
// ソース画像の名前を指定します。画像がバケットのルートディレクトリに保存されていない場合は、画像の完全なパスを指定する必要があります。例: exampledir/src.jpg。
request.fromObject = @"exampledir/src.jpg";
// 処理後の画像を保存するバケットの名前を指定します。バケットは、ソース画像が保存されているバケットと同じリージョンに配置されている必要があります。
request.toBucket = @"destbucket";
// 処理後の画像の名前を指定します。
request.toObject = @"exampledir/dest.jpg";
// 画像を幅 100 ピクセルに比例してリサイズし、処理後の画像を指定されたバケットに保存します。
request.action = @"image/resize,w_100";
// request.action = @"image/resize,w_100";
OSSTask * getTask = [client imageActionPersist:request];

[getTask continueWithBlock:^id _Nullable(OSSTask * _Nonnull task) {
    return nil;
}];
// タスクが完了するまで待機します。
// [getTask waitUntilFinished];
#include <alibabacloud/oss/OssClient.h>
#include <sstream>
using namespace AlibabaCloud::OSS;

int main(void)
{
    /* OSS アカウント情報を初期化します。*/
            
    /* yourEndpoint を、バケットが配置されているリージョンのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。*/
    std::string Endpoint = "yourEndpoint";
    /* yourRegion を、バケットが配置されているリージョンに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。*/
    std::string Region = "yourRegion";
    /* バケット名 (例: examplebucket) を指定します。*/
    std::string BucketName = "examplebucket";
    /* ソースイメージの名前を指定します。イメージがバケットのルートディレクトリにない場合は、完全なパス (例: example/example.jpg) を含めます。*/
    std::string SourceObjectName = "example/example.jpg";
    /* 処理済みイメージの名前を指定します。イメージがバケットのルートディレクトリにない場合は、完全なパス (例: exampledir/example.jpg) を含めます。*/
    std::string TargetObjectName = "exampledir/example.jpg";

    /* ネットワークリソースを初期化します。*/
    InitializeSdk();

    ClientConfiguration conf;
    conf.signatureVersion = SignatureVersionType::V4;
    /* 環境変数からアクセス認証情報を取得します。このサンプルコードを実行する前に、環境変数 OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET が設定されていることを確認してください。*/
    auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
    OssClient client(Endpoint, credentialsProvider, conf);
    client.SetRegion(Region);

    /* イメージの幅と高さを 100 px に固定してサイズ変更し、現在のバケットに保存します。*/
    std::string Process = "image/resize,m_fixed,w_100,h_100";
    std::stringstream ss;
    ss  << Process 
    <<"|sys/saveas"
    << ",o_" << Base64EncodeUrlSafe(TargetObjectName)
    << ",b_" << Base64EncodeUrlSafe(BucketName);
    ProcessObjectRequest request(BucketName, SourceObjectName, ss.str());
    auto outcome = client.ProcessObject(request);
    if (outcome.isSuccess()) {
    std::cout << "Image processed successfully." << std::endl;
    } else {
    std::cout << "Failed to process image. Error code: " << outcome.error().Code()
              << ", Message: " << outcome.error().Message()
              << ", RequestId: " << outcome.error().RequestId() << std::endl;
    }

    /* ネットワークリソースを解放します。*/
    ShutdownSdk();
    return 0;
}

RESTful APIの使用

高度なカスタマイズが必要な場合は、RESTful API を直接呼び出すことができます。RESTful API を直接呼び出すには、コードに署名計算を実装する必要があります。

saveas パラメーターを使用する場合、以下のオプションを含める必要があります。

オプション

説明

o

処理済み画像の保存先オブジェクト名です。このオプションの値は、URL セーフな Base64 でエンコードする必要があります。詳細については、「ウォーターマークのエンコード」をご参照ください。

b

処理済み画像の保存先バケット名です。このオプションの値は、URL セーフな Base64 でエンコードする必要があります。このオプションを指定しない場合、処理済み画像は現在のバケットに保存されます。

次のいずれかの方法で画像を処理し、処理済み画像を特定のバケットに保存できます:

  • 次のサンプルコードは、IMG パラメーターを設定して画像を処理し、処理済み画像を特定のバケットに保存する例です:

    POST /ObjectName?x-oss-process HTTP/1.1
    Host: oss-example.oss.aliyuncs.com
    Content-Length: 247
    Date: Fri, 04 May 2012 03:21:12 GMT
    Authorization: OSS4-HMAC-SHA256 Credential=LTAI********************/20250417/cn-hangzhou/oss/aliyun_v4_request,AdditionalHeaders=content-length,Signature=a7c3554c729d71929e0b84489addee6b2e8d5cb48595adfc51868c299c0c218e
    
    // ソース画像 test.jpg を比率を維持したまま幅 100 ピクセルにリサイズし、処理済み画像を test という名前のバケットに保存します。
    x-oss-process=image/resize,w_100|sys/saveas,o_dGVzdC5qcGc,b_dGVzdA
  • 次のサンプルコードは、画像スタイルを使用して画像を処理し、処理済み画像を特定のバケットに保存する例です:

    POST /ObjectName?x-oss-process HTTP/1.1
    Host: oss-example.oss.aliyuncs.com
    Content-Length: 247
    Date: Fri, 04 May 2012 03:22:13 GMT
    Authorization: OSS4-HMAC-SHA256 Credential=LTAI********************/20250417/cn-hangzhou/oss/aliyun_v4_request,AdditionalHeaders=content-length,Signature=a7c3554c729d71929e0b84489addee6b2e8d5cb48595adfc51868c299c0c218e
    
    // examplestyle という名前の画像スタイルを使用してソース画像 test.jpg を処理し、処理済み画像を test という名前のバケットに保存します。
    x-oss-process=style/examplestyle|sys/saveas,o_dGVzdC5qcGc,b_dGVzdA