如果您希望對儲存在OSS中的圖片進行一系列的操作,例如圖片縮放、裁剪、旋轉、添加浮水印等。您可以通過OSS建立圖片樣式,然後在圖片樣式中定義多個圖片處理相關操作。通過OSS圖片樣式,您可以對Bucket下的所有圖片執行圖片樣式中定義的所有操作,實現Bucket中圖片的快速處理和轉換操作。
建立樣式
一個儲存空間(Bucket)最多可建立50個樣式,這些樣式僅支援作用於該Bucket下的圖片檔案。如您的業務有更多樣式的需求,請聯絡支援人員。
使用OSS控制台
登入OSS管理主控台。
單擊Bucket 列表,然後單擊目標Bucket名稱。
在左側導覽列,選擇數據處理 > 圖片處理。
在圖片處理頁面,單擊 建立樣式。
在 建立樣式面板,選擇以下任意方式配置樣式。
基礎配置:通過圖形化介面選擇您需要的圖片處理方式,您可以按需設定以下參數。
分類
參數
說明
規則名稱
規則名稱
圖片樣式規則名稱。長度為1~63個字元,只能包含英文字母、數字、底線(_)、短劃線(-)和英文句點(.)。
映像
格式轉換
圖片是否需要進行格式轉換,原圖格式表示不轉換。
按需選擇原圖格式、jpg、jpeg、png、bmp、gif、webp、tiff。
漸進顯示
先顯示整個圖片的模糊輪廓,然後逐漸載入直至顯示完整的圖片。
說明僅對格式為JPG的圖片有效。
自適應方向
根據圖片中EXIF旋轉資訊先旋轉後進行縮減。
圖片品質
按需選擇相對品質、絕對品質、不壓縮。
關於圖片品質的更多資訊,請參見品質變換。
縮減
縮減方式
按需選擇不使用縮減、等比例縮小、等比例放大、指定寬高縮放。
效果
圖片亮度
拖動滑塊設定亮度大小。
0表示原圖亮度,小於0表示低於原圖亮度,大於0表示高於原圖亮度。
圖片對比
拖動滑塊設定對比大小。
0表示原圖對比,小於0表示低於原圖對比,大於0表示高於原圖對比。
圖片銳利化
銳利化參數用於提高儲存在OSS內原圖的清晰度。
開啟圖片銳利化開關後,可以拖動滑塊設定銳利化大小。
圖片模糊
開啟圖片模糊開關後,可以拖動滑塊設定模糊半徑和模糊標準差大小。
圖片旋轉
拖動滑塊設定圖片旋轉角度。
浮水印
浮水印
按需選擇不使用浮水印、使用圖片浮水印、使用文字浮水印。
高級配置:使用API代碼編輯圖片處理方式,格式為
image/action1,parame_value1/action2,parame_value2/...
。目前已支援的圖片處理參數,請參見圖片處理參數。例如
image/resize,p_63/quality,q_90
表示先將圖片縮放到原圖的63%,再設定圖片相對品質為90%。說明如果您需要在樣式中同時包含浮水印圖片和浮水印文字的操作,請使用進階編輯建立樣式。
單擊確定。
使用阿里雲SDK
僅Python SDK、Go SDK支援建立圖片樣式。
Python
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# 填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
# yourBucketName填寫Bucket名稱,例如examplebucket。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'examplebucket')
# 設定圖片樣式名稱,例如imagestyle。
style = 'imagestyle'
# 設定圖片樣式指向的圖片操作,例如將原圖縮放為固定寬度200 px。
content = 'image/resize,w_200'
# 新增圖片樣式。
result = bucket.put_bucket_style(style, content)
print('設定樣式成功,返回狀態為:' + str(result.status))
Go
package main
import (
"fmt"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
"os"
)
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填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 填寫Bucket名稱,例如examplebucket。
bucketName := "examplebucket"
// 設定圖片樣式指向的圖片操作,例如先將圖片縮放到原圖的63%,再設定圖片相對品質為90%。
styleContent := "image/resize,p_63/quality,q_90"
// 設定圖片樣式名稱,例如imagestyle。
styleName := "imagestyle"
err = client.PutBucketStyle(bucketName,styleName,styleContent)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
fmt.Println("Bucket Style Set Success!")
}
使用命令列工具ossutil
關於使用ossutil建立圖片樣式的具體步驟,請參見style(設定圖片樣式)。
使用REST API
如果您的程式自訂要求較高,您可以直接發起REST API請求。直接發起REST API請求需要手動編寫代碼計算簽名。更多資訊,請參見PutStyle。
樣式使用規則
圖片樣式配置完成後,您可以通過圖片處理URL和阿里雲SDK的方式使用樣式來處理圖片。
使用樣式處理動態圖片(如GIF格式的圖片),需要在樣式中加入格式轉換參數/format,gif,否則可能會導致動態圖片在處理後變為靜態圖。
使用圖片處理URL
您可以直接將圖片樣式添加到圖片的訪問URL上,格式為http(s)//:BucketName.Endpoint/ObjectName?x-oss-process=style/<StyleName>
,樣本為https://oss-console-img-demo-cn-hangzhou-3az.oss-cn-hangzhou.aliyuncs.com/example.jpg?x-oss-process=style/small。
如果您設定了自訂分隔字元,可使用分隔字元代替?x-oss-process=style/
內容,進一步簡化圖片處理URL。關於設定自訂分隔字元的具體操作,請參見設定自訂分隔字元。
例如,分隔字元設定為英文驚嘆號(!),則圖片處理URL為http(s)//:BucketName.Endpoint/ObjectName!StyleName
您還可以為Bucket綁定自訂網域名,以進一步簡化圖片處理URL。例如Bucket綁定了自訂網域名example.com
,則樣本URL可替換為https://example.com/example.jpg!small
。綁定自訂網域名後,您還可以線上預覽圖片處理的效果。更多資訊,請參見綁定自訂網域名至Bucket預設網域名稱。
使用阿里雲SDK
您可以使用阿里雲SDK將多個圖片處理參數封裝在一個樣式中,然後使用圖片樣式批量處理圖片。以下僅列舉常見SDK的使用圖片樣式處理圖片的程式碼範例,關於其他SDK的使用圖片樣式處理圖片的程式碼範例,請參見SDK簡介。
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.model.GetObjectRequest;
import java.io.File;
public class Demo {
public static void main(String[] args) throws Throwable {
// Endpoint以華東1(杭州)為例,其它Region請按實際情況填寫。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// 填寫Bucket名稱,例如examplebucket。
String bucketName = "examplebucket";
// 填寫Object完整路徑。Object完整路徑中不能包含Bucket名稱。
String objectName = "exampleobject.jpg";
// 填寫本地檔案的完整路徑,例如D:\\localpath\\example-new.jpg。如果指定的本地檔案存在會覆蓋,不存在則建立。
String pathName = "D:\\localpath\\example-new.jpg";
// 建立OSSClient執行個體。
OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);
try {
// 使用自訂樣式處理圖片。
// yourCustomStyleName填寫通過OSS管理主控台建立的圖片樣式名稱。
String style = "style/yourCustomStyleName";
GetObjectRequest request = new GetObjectRequest(bucketName, objectName);
request.setProcess(style);
// 將處理後的圖片命名為example-new.jpg並儲存到本地。
// 如果未指定本地路徑只填寫了檔案名稱(例如example-new.jpg),則檔案預設儲存到樣本程式所屬專案對應本地路徑中。
ossClient.getObject(request, new File(pathName));
} 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填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
$endpoint = "yourEndpoint";
// 填寫Bucket名稱,例如examplebucket。
$bucket= "examplebucket";
// 填寫Object完整路徑,例如exampledir/exampleobject.jpg。Object完整路徑中不能包含Bucket名稱。
$object = "exampledir/exampleobject.jpg";
// 填寫本地檔案的完整路徑,例如D:\\localpath\\example-new.jpg。如果指定的本地檔案存在會覆蓋,不存在則建立。
// 如果未指定本地路徑只填寫了本地檔案名稱(例如example-new.jpg),則檔案預設儲存到樣本程式所屬專案對應本地路徑中。
$download_file = "D:\\localpath\\example-new.jpg";
$config = array(
"provider" => $provider,
"endpoint" => $endpoint,
);
$ossClient = new OssClient($config);
// 如果靶心圖表片不在指定Bucket中,需上傳圖片到目標Bucket。
// $ossClient->uploadFile($bucket, $object, "D:\\localpath\\exampleobject.jpg");
// 使用自訂樣式處理圖片。
// yourCustomStyleName填寫通過OSS管理主控台建立的圖片樣式名稱。
$style = "style/yourCustomStyleName";
$options = array(
OssClient::OSS_FILE_DOWNLOAD => $download_file,
OssClient::OSS_PROCESS => $style);
// 將處理後的圖片命名為example-new.jpg並儲存到本地。
$ossClient->getObject($bucket, $object, $options);
// 圖片處理完成後,如果Bucket中的原圖不再需要,可以刪除原圖。
// $ossClient->deleteObject($bucket, $object);
const OSS = require('ali-oss');
const client = new OSS({
// yourregion填寫Bucket所在地區。以華東1(杭州)為例,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,
// yourbucketname填寫儲存空間名稱。
bucket: 'yourbucketname'
});
// 將圖片縮放為固定寬高100 px。
async function scale() {
try {
const result = await client.get('example.jpg', './example-resize.jpg', { process: 'image/resize,m_fixed,w_100,h_100'});
} catch (e) {
console.log(e);
}
}
scale()
// 從座標(100,100)開始,將圖片裁剪為寬高100 px。
async function cut() {
try {
const result = await client.get('example.jpg', './example-crop.jpg', { process: 'image/crop,w_100,h_100,x_100,y_100,r_1'});
} catch (e) {
console.log(e)
}
}
cut()
// 將圖片旋轉90°。
async function rotate() {
try {
const result = await client.get('example.jpg', './example-rotate.jpg', { process: 'image/rotate,90'});
} catch (e) {
console.log(e);
}
}
rotate()
// 將圖片進行銳利化,銳利化參數為100。
async function sharpen() {
try {
const result = await client.get('example.jpg', './example-sharpen.jpg', { process: 'image/sharpen,100'});
} catch (e) {
console.log(e);
}
}
sharpen()
// 在圖片中添加浮水印。
async function watermark() {
try {
const result = await client.get('example.jpg', './example-watermark.jpg', { process: 'image/watermark,text_SGVsbG8g5Zu-54mH5pyN5YqhIQ'});
} catch (e) {
console.log(e);
}
}
watermark()
// 將圖片進行格式轉換。
async function format() {
try {
const result = await client.get('example.jpg', './example-format.jpg', { process: 'image/format,png'});
} catch (e) {
console.log(e);
}
}
format()
// 擷取圖片資訊。
async function info() {
try {
const result = await client.get('example.jpg', './example-info.txt', {process: 'image/info'});
} catch (e) {
console.log(e);
}
}
info()
# -*- coding: utf-8 -*-
import os
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# yourEndpoint填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
# 填寫Bucket名稱。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'examplebucket')
# 指定原圖所在的Bucket名稱,例如examplebucket。
bucket_name = 'examplebucket'
# 指定原圖名稱。如果圖片不在Bucket根目錄,需攜帶圖片完整路徑,例如exampledir/example.jpg。
key = 'exampledir/example.jpg'
# 指定處理後的圖片名稱。
new_pic = 'exampledir/newexample.jpg'
# 如果圖片不在指定Bucket內,需將本地路徑下的圖片上傳到指定Bucket。
# bucket.put_object_from_file(key, 'D:\\localpath\\example.jpg')
# 使用自訂樣式處理圖片。其中,yourCustomStyleName填寫通過OSS管理主控台建立的圖片樣式名稱。
style = 'style/yourCustomStyleName'
# 將處理後的圖片儲存在本地。
bucket.get_object_to_file(key, new_pic, process=style)
# 圖片處理完成後,如果Bucket內的原圖不再需要,可將其刪除。
# bucket.delete_object(key)
# 如果處理後的圖片不再需要,可將其刪除。
# os.remove(new_pic)
package main
import (
"fmt"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
"os"
)
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填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 指定原圖所在的Bucket名稱,例如examplebucket。
bucketName := "examplebucket"
bucket, err := client.Bucket(bucketName)
if err != nil {
HandleError(err)
}
// 指定原圖名稱。如果圖片不在Bucket根目錄,需攜帶檔案完整路徑,例如example/example.jpg。
sourceImageName := "example/example.jpg"
// 將處理後的圖片命名為newexample.jpg並儲存到本地。
targetImageName := "D:\\localpath\\newexample.jpg"
// 使用圖片樣式處理圖片。其中,yourCustomStyleName填寫通過OSS管理主控台建立的圖片樣式名稱。
style := "style/yourCustomStyleName"
// 將處理後的圖片儲存在本地。
err = bucket.GetObjectToFile(sourceImageName, targetImageName, oss.Process(style))
if err != nil {
HandleError(err)
}
}
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* 初始化OSS帳號資訊。*/
/* yourEndpoint填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。*/
std::string Endpoint = "yourEndpoint";
/* 指定原圖所在的Bucket名稱,例如examplebucket。*/
std::string BucketName = "examplebucket";
/* 指定原圖名稱。如果圖片不在Bucket根目錄,需攜帶圖片完整路徑,例如exampledir/example.jpg。*/
std::string ObjectName = "exampledir/example.jpg";
/* 初始化網路等資源。*/
InitializeSdk();
ClientConfiguration conf;
/* 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
/* 使用圖片樣式處理圖片。其中,yourCustomStyleName填寫步驟1建立的圖片樣式名稱。*/
std::string Process = "style/yourCustomStyleName";
GetObjectRequest request(BucketName, ObjectName);
request.setProcess(Process);
auto outcome = client.GetObject(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;
}
#include "oss_api.h"
#include "aos_http_io.h"
/* yourEndpoint填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。*/
const char *endpoint = "yourEndpoint";
/* 填寫Bucket名稱,例如examplebucket。*/
const char *bucket_name = "examplebucket";
/* 填寫Object完整路徑,完整路徑中不能包含Bucket名稱,例如exampledir/exampleobject.txt。*/
const char *object_name = "exampledir/exampleobject.txt";
void init_options(oss_request_options_t *options)
{
options->config = oss_config_create(options->pool);
/* 用char*類型的字串初始化aos_string_t類型。*/
aos_str_set(&options->config->endpoint, endpoint);
/* 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/
aos_str_set(&options->config->access_key_id, getenv("OSS_ACCESS_KEY_ID"));
aos_str_set(&options->config->access_key_secret, getenv("OSS_ACCESS_KEY_SECRET"));
/* 是否使用了CNAME。0表示不使用。*/
options->config->is_cname = 0;
/* 用於設定網路相關參數,比如逾時時間等。*/
options->ctl = aos_http_controller_create(options->pool, 0);
}
int main(int argc, char *argv[])
{
/* 在程式入口調用aos_http_io_initialize方法來初始化網路、記憶體等全域資源。*/
if (aos_http_io_initialize(NULL, 0) != AOSE_OK) {
exit(1);
}
/* 用於記憶體管理的記憶體池(pool),等價於apr_pool_t。其實現代碼在apr庫中。*/
aos_pool_t *pool;
/* 重新建立一個記憶體池,第二個參數是NULL,表示沒有繼承其它記憶體池。*/
aos_pool_create(&pool, NULL);
/* 建立並初始化options,該參數包括endpoint、access_key_id、acces_key_secret、is_cname、curl等全域配置資訊。*/
oss_request_options_t *oss_client_options;
/* 在記憶體池中分配記憶體給options。*/
oss_client_options = oss_request_options_create(pool);
/* 初始化Client的選項oss_client_options。*/
init_options(oss_client_options);
/* 初始化參數。*/
aos_string_t bucket;
aos_string_t object;
aos_string_t file;
aos_table_t *headers = NULL;
aos_table_t *params = NULL;
aos_table_t *resp_headers = NULL;
aos_status_t *resp_status = NULL;
aos_str_set(&bucket, bucket_name);
aos_str_set(&object, object_name);
/* 指定圖片樣式。*/
params = aos_table_make(pool, 1);
/* yourCustomStyleName填寫步驟1建立的圖片樣式名稱。*/
apr_table_set(params, OSS_PROCESS, "style/yourCustomStyleName");
/* 將處理後的圖片儲存到本地。*/
aos_str_set(&file, "yourLocalFileName");
resp_status = oss_get_object_to_file(oss_client_options, &bucket, &object, headers, params, &file, &resp_headers);
if (aos_status_is_ok(resp_status)) {
printf("get object to file succeeded\n");
} else {
printf("get object to file failed\n");
}
/* 釋放記憶體池,相當於釋放了請求過程中各資源分派的記憶體。*/
aos_pool_destroy(pool);
/* 釋放之前分配的全域資源。*/
aos_http_io_deinitialize();
return 0;
}
將源Bucket的樣式匯入目標Bucket
您可以匯出源Bucket中已建立的樣式,並將樣式匯入到目標Bucket,便於在目標Bucket中快速應用樣式來處理圖片檔案。
在源Bucket中匯出樣式。
在源Bucket管理頁面,選擇數據處理 > 圖片處理。
在圖片處理頁面,選中目標樣式,然後單擊匯出樣式。
在目標Bucket匯入樣式。
在目標Bucket管理頁面,選擇數據處理 >圖片處理。
在圖片處理頁面,單擊匯入樣式。
在彈出的對話方塊選擇已匯出的樣式檔案,然後單擊開啟。
樣式匯入完成後,即可在目標Bucket中使用這些樣式處理圖片檔案。
常見問題
圖片樣式收費嗎?
通過樣式形式進行圖片處理訪問,樣式本身不收費,只收取樣式內容對應的圖片處理所產生的費用。關於圖片處理費用的更多資訊,請參見費用說明。