デフォルトでは、Object Storage Service (OSS) はイメージ処理 (IMG) リクエストのパラメーターに基づいてソースイメージを処理しますが、処理済みのイメージは保存しません。サムネイル、トリミングされたイメージ、またはフォーマット変換されたイメージなど、同じ処理結果を表示する場合は、処理済みのイメージを保存できます。処理済みのイメージをオブジェクトとして特定のバケットに保存するには、IMG リクエストに saveas パラメーターを追加する必要があります。
注意
必要な権限
処理済みのイメージを保存するには、ソースバケットに対する
oss:PostProcessTask権限、および宛先バケットに対するoss:PutBucket権限と宛先オブジェクトに対するoss:PutObject権限が必要です。ストレージリージョン
処理済みのイメージは、ソースイメージが保存されているのと同じバケット、または別のバケットに保存できます。ただし、ソースバケットと宛先バケットは、同じ Alibaba Cloud アカウントに属し、同じリージョンに配置されている必要があります。
保存方法
saveas パラメーターを追加して、SDK を使用して処理されたイメージを指定されたバケットに保存できます。詳細については、「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 が不要になったら、shutdown メソッドを呼び出してリソースを解放します。
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
// イメージを高さと幅が 100 ピクセルになるようにサイズ変更します。
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({
// バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを 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"
# エンドポイントにマッピングされるリージョンの ID を指定します。例: cn-hangzhou。このパラメーターは、署名アルゴリズム V4 を使用する場合に必要です。
region = "cn-hangzhou"
# バケットの名前を指定します。
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 × 100 ピクセルにサイズ変更します。
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 は、実行する IMG 操作を指定します。上記の例では "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 インスタンスを作成します。
// バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。実際のエンドポイントを指定してください。
// バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを 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 x 100 ピクセルにサイズ変更し、特定のバケットにイメージを保存します。
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 = @"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 へのアクセスに使用されるアカウントに関する情報を初期化します。 */
/* バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 */
std::string Endpoint = "yourEndpoint";
/* バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを 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 ピクセルになるようにサイズ変更し、ソースイメージが保存されているバケットにイメージを保存します。 */
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