如果您希望對存儲在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上,格式為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簡介。
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中使用這些樣式處理圖片文件。
常見問題
圖片樣式收費么?
通過樣式形式進行圖片處理訪問,樣式本身不收費,只收取樣式內容對應的圖片處理所產生的費用。關于圖片處理費用的更多信息,請參見費用說明。