图片样式

如果您希望对存储在OSS中的图片进行一系列的操作,例如图片缩放、裁剪、旋转、添加水印等。您可以通过OSS创建图片样式,然后在图片样式中定义多个图片处理相关操作。通过OSS图片样式,您可以对Bucket下的所有图片执行图片样式中定义的所有操作,实现Bucket中图片的快速处理和转换操作。

创建样式

一个存储空间(Bucket)最多可创建50个样式,这些样式仅支持作用于该Bucket下的图片文件。如您的业务有更多样式的需求,请联系技术支持

使用OSS控制台

  1. 登录OSS管理控制台

  2. 单击Bucket 列表,然后单击目标Bucket名称。

  3. 在左侧导航栏,选择数据处理 > 图片处理

  4. 图片处理页面,单击创建样式

  5. 创建样式 面板,选择以下任意方式配置样式。

    • 基础配置:通过图形化界面选择您需要的图片处理方式,您可以按需设置以下参数。

      分类

      参数

      说明

      规则名称

      规则名称

      图片样式规则名称。长度为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%。

      说明

      如果您需要在样式中同时包含水印图片和水印文字的操作,请使用高级编辑新建样式。

  6. 单击确定

使用阿里云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中快速应用样式来处理图片文件。

  1. 在源Bucket中导出样式。

    1. 在源Bucket管理页面,选择数据处理 > 图片处理

    2. 图片处理页面,选中目标样式,然后单击导出样式

  2. 在目标Bucket导入样式。

    1. 在目标Bucket管理页面,选择数据处理 >图片处理

    2. 图片处理页面,单击导入样式

    3. 在弹出的对话框选择已导出的样式文件,然后单击打开

      样式导入完成后,即可在目标Bucket中使用这些样式处理图片文件。

常见问题

图片样式收费么?

通过样式形式进行图片处理访问,样式本身不收费,只收取样式内容对应的图片处理所产生的费用。关于图片处理费用的更多信息,请参见费用说明

更多参考