图片处理是OSS提供的海量、安全、低成本、高可靠的图片处理服务。原始图片上传到OSS后,您可以通过简单的RESTful接口,在任何时间、任何地点、任何互联网设备上对图片进行处理。

说明 图片处理支持的参数请参见 处理参数。图片处理的完整代码请参见 GitHub

使用图片处理参数处理图片

  • 使用单个图片处理参数处理图片
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    // <var class="keyword varname" id="varname-jmp-tgh-48i">yourEndpoint</var>填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com
    String endpoint = "<var class="keyword varname" id="varname-li2-7xy-x82">yourEndpoint</var>";
    // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
    String accessKeyId = "<var class="keyword varname" id="varname-dm9-mkn-v4o">yourAccessKeyId</var>";
    String accessKeySecret = "<var class="keyword varname" id="varname-ddo-0jy-inq">yourAccessKeySecret</var>";
    // 填写Bucket名称。
    String bucketName = "examplebucket";
    // 填写Object完整路径。Object完整路径中不能包含Bucket名称。
    String objectName = "exampleobject.jpg";
     
    // 创建OSSClient实例。
    OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
     
    // 将图片缩放为固定宽高100 px。
    String style = "image/resize,m_fixed,w_100,h_100";
    GetObjectRequest request = new GetObjectRequest(bucketName, objectName);
    request.setProcess(style);
    // 将处理后的图片命名为example-resize.jpg并保存到本地。
    // 填写本地文件的完整路径,例如D:\\localpath\\example-resize.jpg。如果指定的本地文件存在会覆盖,不存在则新建。
    // 如果未指定本地路径只填写了本地文件名称(例如example-resize.jpg),则文件默认保存到示例程序所属项目对应本地路径中。
    ossClient.getObject(request, new File("D:\\localpath\\example-resize.jpg"));
     
    // 关闭OSSClient。
    ossClient.shutdown();
  • 使用不同的图片处理参数处理图片
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    // <var class="keyword varname" id="varname-017-fkq-107">yourEndpoint</var>填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com
    String endpoint = "<var class="keyword varname" id="varname-l1e-cv1-20i">yourEndpoint</var>";
    // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
    String accessKeyId = "<var class="keyword varname" id="varname-bqh-70a-8q1">yourAccessKeyId</var>";
    String accessKeySecret = "<var class="keyword varname" id="varname-9si-vga-5l1">yourAccessKeySecret</var>";
    // 填写Bucket名称。
    String bucketName = "examplebucket";
    // 填写Object完整路径。Object完整路径中不能包含Bucket名称。
    String objectName = "exampleobject.jpg";
     
    // 创建OSSClient实例。
    OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
     
    // 将图片缩放为固定宽高100 px。
    String style = "image/resize,m_fixed,w_100,h_100";
    GetObjectRequest request = new GetObjectRequest(bucketName, objectName);
    request.setProcess(style);
    // 将处理后的图片命名为example-resize.jpg并保存到本地。
    // 填写本地文件的完整路径,例如D:\\localpath\\example-resize.jpg。如果指定的本地文件存在会覆盖,不存在则新建。
    // 如果未指定本地路径只填写了本地文件名称(例如example-resize.jpg),则文件默认保存到示例程序所属项目对应本地路径中。
    ossClient.getObject(request, new File("D:\\localpath\\example-resize.jpg"));
     
    // 从坐标(100,100)开始,将图片裁剪为宽高100 px。
    style = "image/crop,w_100,h_100,x_100,y_100";
    request = new GetObjectRequest(bucketName, objectName);
    request.setProcess(style);
    // 将处理后的图片命名为example-crop.jpg并保存到本地。
    ossClient.getObject(request, new File("D:\\localpath\\example-crop.jpg"));
     
    // 将图片旋转90°。
    style = "image/rotate,90";
    request = new GetObjectRequest(bucketName, objectName);
    request.setProcess(style);
    // 将处理后的图片命名为example-rotate.jpg并保存到本地。
    ossClient.getObject(request, new File("D:\\localpath\\example-rotate.jpg"));
     
    // 在图片中添加文字水印。
    // 文字水印的文字内容经过Base64编码后,再将编码结果中的加号(+)替换成短划线(-),正斜线(/)替换成下划线(_)并去掉尾部的等号(=),从而得到水印字符串。
    // 指定文字水印的文字内容为Hello World,文字内容进行编码处理后得到的水印字符串为SGVsbG8gV29ybGQ。
    style = "image/watermark,text_SGVsbG8gV29ybGQ";
    request = new GetObjectRequest(bucketName, objectName);
    request.setProcess(style);
    // 将处理后的图片命名为example-watermarktext.jpg并保存到本地。
    ossClient.getObject(request, new File("D:\\localpath\\example-watermarktext.jpg"));
     
    // 在图片中添加图片水印。请确保水印图片已保存在图片所在Bucket中。
    // 水印图片的完整路径经过Base64编码后,再将编码结果中的加号(+)替换成短划线(-),正斜线(/)替换成下划线(_)并去掉尾部的等号(=),从而得到水印字符串。
    // 指定水印图片的完整路径为panda.jpg,完整路径进行编码处理后得到的水印字符串为cGFuZGEuanBn。
    style = "image/watermark,image_cGFuZGEuanBn";
    request = new GetObjectRequest(bucketName, objectName);
    request.setProcess(style);
    // 将处理后的图片命名为example-watermarkimage.jpg并保存到本地。
    ossClient.getObject(request, new File("D:\\localpath\\example-watermarkimage.jpg"));
     
    // 关闭OSSClient。
    ossClient.shutdown();
  • 同时使用多个图片处理参数处理图片

    使用多个图片处理参数处理图片时,多个参数之间以正斜线(/)分隔。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    // <var class="keyword varname" id="varname-xmz-6l6-d7b">yourEndpoint</var>填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com
    String endpoint = "<var class="keyword varname" id="varname-8hi-zdw-nnh">yourEndpoint</var>";
    // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
    String accessKeyId = "<var class="keyword varname" id="varname-f14-mju-uo8">yourAccessKeyId</var>";
    String accessKeySecret = "<var class="keyword varname" id="varname-s0w-yzh-104">yourAccessKeySecret</var>";
    // 填写Bucket名称。
    String bucketName = "examplebucket";
    // 填写Object完整路径。Object完整路径中不能包含Bucket名称。
    String objectName = "exampleobject.jpg";
     
    // 创建OSSClient实例。
    OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
     
    // 将图片缩放为固定宽高100 px后,再旋转90°。
    String style = "image/resize,m_fixed,w_100,h_100/rotate,90";
    GetObjectRequest request = new GetObjectRequest(bucketName, objectName);
    request.setProcess(style);
    // 将处理后的图片命名为example-new.jpg并保存到本地。
    // 填写本地文件的完整路径,例如D:\\localpath\\example-new.jpg。如果指定的本地文件存在会覆盖,不存在则新建。
    // 如果未指定本地路径只填写了文件名称(例如example-new.jpg),则文件默认保存到示例程序所属项目对应本地路径中。
    ossClient.getObject(request, new File("D:\\localpath\\example-new.jpg"));
     
    // 关闭OSSClient。
    ossClient.shutdown();

使用图片样式处理图片

您可以通过OSS管理控制台创建图片样式将多个图片处理参数封装在一个样式中,然后使用样式批量处理图片。具体操作,请参见图片样式

以下代码展示了使用图片样式处理图片。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// <var class="keyword varname" id="varname-97j-ihn-20q">yourEndpoint</var>填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com
String endpoint = "<var class="keyword varname" id="varname-hcn-bei-w4w">yourEndpoint</var>";
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
String accessKeyId = "<var class="keyword varname" id="varname-7wt-xh2-2r5">yourAccessKeyId</var>";
String accessKeySecret = "<var class="keyword varname" id="varname-6sd-nbc-50q">yourAccessKeySecret</var>";
// 填写Bucket名称。
String bucketName = "examplebucket";
// 填写Object完整路径。Object完整路径中不能包含Bucket名称。
String objectName = "exampleobject.jpg";
 
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
 
// 使用自定义样式处理图片。
// <var class="keyword varname" id="varname-js4-q6y-3oz">yourCustomStyleName</var>填写通过OSS管理控制台创建的图片样式名称。
String style = "style/<var class="keyword varname" id="varname-e3p-q0c-ysb">yourCustomStyleName</var>";
GetObjectRequest request = new GetObjectRequest(bucketName, objectName);
request.setProcess(style);
// 将处理后的图片命名为example-new.jpg并保存到本地。
// 填写本地文件的完整路径,例如D:\\localpath\\example-new.jpg。如果指定的本地文件存在会覆盖,不存在则新建。
// 如果未指定本地路径只填写了文件名称(例如example-new.jpg),则文件默认保存到示例程序所属项目对应本地路径中。
ossClient.getObject(request, new File("D:\\localpath\\example-new.jpg"));
 
// 关闭OSSClient。
ossClient.shutdown();

图片处理持久化

图片处理服务默认不保存处理后的图片,您可以通过ImgSaveAs接口将图片保存到原图片所在存储空间。

以下代码展示了图片处理持久化操作。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// <var class="keyword varname" id="varname-yi9-5qc-dka">yourEndpoint</var>填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com
String endpoint = "<var class="keyword varname" id="varname-4tu-b1d-3qa">yourEndpoint</var>";
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
String accessKeyId = "<var class="keyword varname" id="varname-1oy-mb3-du1">yourAccessKeyId</var>";
String accessKeySecret = "<var class="keyword varname" id="varname-k30-pcm-eki">yourAccessKeySecret</var>";
// 填写Bucket名称。
String bucketName = "examplebucket";
// 填写Object完整路径。Object完整路径中不能包含Bucket名称。
String sourceImage = "exampleimage.png";
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
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并保存到当前Bucket。
    // 填写Object完整路径。Object完整路径中不能包含Bucket名称。
    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 (Exception e) {
    e.printStackTrace();
}
// 关闭OSSClient。
ossClient.shutdown();

生成带图片处理参数的文件签名URL

私有文件的访问URL带有签名。OSS不支持在带签名的URL后直接添加图片处理参数。如果您想要对私有文件进行图片处理,需要将图片处理参数加入到签名中,相关的代码示例如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// <var class="keyword varname" id="varname-joo-iei-2s5">yourEndpoint</var>填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com
String endpoint = "<var class="keyword varname" id="varname-ma7-8lc-axz">yourEndpoint</var>";
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
String accessKeyId = "<var class="keyword varname" id="varname-4e0-9m6-kig">yourAccessKeyId</var>";
String accessKeySecret = "<var class="keyword varname" id="varname-lug-o26-rbd">yourAccessKeySecret</var>";
// 填写Bucket名称。
String bucketName = "examplebucket";
// 填写Object完整路径。Object完整路径中不能包含Bucket名称。
String objectName = "exampleobject.jpg";
 
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 将图片缩放为固定宽高100 px后,再旋转90°。
String style = "image/resize,m_fixed,w_100,h_100/rotate,90";
// 指定签名URL过期时间为10分钟。
Date expiration = new Date(new Date().getTime() + 1000 * 60 * 10 );
GeneratePresignedUrlRequest req = new GeneratePresignedUrlRequest(bucketName, objectName, HttpMethod.GET);
req.setExpiration(expiration);
req.setProcess(style);
URL signedUrl = ossClient.generatePresignedUrl(req);
System.out.println(signedUrl);
 
// 关闭OSSClient。
ossClient.shutdown();

图片处理工具

您可以通过可视化图片处理工具ImageStyleViewer直观地看到OSS图片处理结果。