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

图片处理的详细信息请参见OSS图片处理指南

图片处理的完整代码请参见:GitHub

图片处理功能

OSS图片处理提供以下功能:

图片处理使用

图片处理使用标准的HTTP GET请求。您可以在URL的QueryString中设置处理参数。

如果图片文件的访问权限为私有读写,必须通过授权才能进行访问。

  • 匿名访问

    您可以通过如下格式的三级域名匿名访问处理后的图片:

    http://<yourBucketName>.<yourEndpoint>/<yourObjectName>?x-oss-process=image/<yourAction>,<yourParamValue>
    参数 描述
    bucket 存储空间名称
    endpoint 存储空间所在地域的访问域名
    object 图片文件名称
    image 图片处理的保留标志符
    action 对图片做的操作,如缩放、裁剪、旋转等
    param 对图片做的操作所对应的参数
    • 基础操作

      例如,将图缩略成宽度为100,高度按比例处理:

      http://image-demo.oss-cn-hangzhou.aliyuncs.com/example.jpg?x-oss-process=image/resize,w_100
    • 自定义样式

      使用如下格式的三级域名匿名访问图片处理:

      http://<yourBucketName>.<yourEndpoint>/<yourObjectName>?x-oss-process=style/<yourStyleName>
      • style:自定义样式的保留标志符。
      • yourStyleName:自定义样式名称,即通过控制台自定义样式的规则名称。

      例如:

      http://image-demo.oss-cn-hangzhou.aliyuncs.com/example.jpg?x-oss-process=style/oss-pic-style-w-100
    • 级联处理

      通过级联处理,可以对一张图片顺序进行多个操作,格式如下:

      http://<yourBucketName>.<yourEndpoint>/<yourObjectName>?x-oss-process=image/<yourAction1>,<yourParamValue1>/<yourAction2>,<yourParamValue2>/...

      例如:

      http://image-demo.oss-cn-hangzhou.aliyuncs.com/example.jpg?x-oss-process=image/resize,w_100/rotate,90
    • 支持HTTPS访问

      图片服务支持HTTPS访问,例如:

      https://image-demo.oss-cn-hangzhou.aliyuncs.com/example.jpg?x-oss-process=image/resize,w_100
  • 授权访问

    授权访问支持自定义样式、HTTPS和级联处理。

    以下代码用于生成带签名的图片处理URL:

    // Endpoint以杭州为例,其它Region请按实际情况填写。
    String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
    // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
    String accessKeyId = "<yourAccessKeyId>";
    String accessKeySecret = "<yourAccessKeySecret>";
    String bucketName = "<yourBucketName>";
    String objectName = "<yourObjectName>";
    // 创建OSSClient实例。
    OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    // 设置图片处理样式。
    String style = "image/resize,m_fixed,w_100,h_100/rotate,90";
    // 指定过期时间为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();sClient.shutdown();
  • SDK访问

    对于任意权限的图片文件,都可以直接使用SDK访问和处理。

    SDK处理图片文件支持自定义样式、HTTPS和级联处理。

    • 基础操作

      以下代码展示了图片处理的基础操作:

      // Endpoint以杭州为例,其它Region请按实际情况填写。
      String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
      // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
      String accessKeyId = "<yourAccessKeyId>";
      String accessKeySecret = "<yourAccessKeySecret>";
      String bucketName = "<yourBucketName>";
      String objectName = "<yourObjectName>";
      // 创建OSSClient实例。
      OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
      // 缩放
      String style = "image/resize,m_fixed,w_100,h_100";
      GetObjectRequest request = new GetObjectRequest(bucketName, objectName);
      request.setProcess(style);
      ossClient.getObject(request, new File("example-resize.jpg"));
      // 裁剪
      style = "image/crop,w_100,h_100,x_100,y_100,r_1";
      request = new GetObjectRequest(bucketName, objectName);
      request.setProcess(style);
      ossClient.getObject(request, new File("example-crop.jpg"));
      // 旋转
      style = "image/rotate,90";
      request = new GetObjectRequest(bucketName, objectName);
      request.setProcess(style);
      ossClient.getObject(request, new File("example-rotate.jpg"));
      // 锐化
      style = "image/sharpen,100"; 
      request = new GetObjectRequest(bucketName, objectName);
      request.setProcess(style);
      ossClient.getObject(request, new File("example-sharpen.jpg"));
      // 水印
      style = "image/watermark,text_SGVsbG8g5Zu-54mH5pyN5YqhIQ"; 
      request = new GetObjectRequest(bucketName, objectName);
      request.setProcess(style);
      ossClient.getObject(request, new File("example-watermark.jpg"));
      // 格式转换
      style = "image/format,png";
      request = new GetObjectRequest(bucketName, objectName);
      request.setProcess(style);
      ossClient.getObject(request, new File("example-format.png"));
      // 获取图片信息
      style = "image/info";
      request = new GetObjectRequest(bucketName, objectName);
      request.setProcess(style);
      ossClient.getObject(request, new File("example-info.txt"));
      // 关闭OSSClient。
      ossClient.shutdown();
    • 自定义样式

      以下代码用于自定义图片样式:

      // Endpoint以杭州为例,其它Region请按实际情况填写。
      String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
      // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
      String accessKeyId = "<yourAccessKeyId>";
      String accessKeySecret = "<yourAccessKeySecret>";
      String bucketName = "<yourBucketName>";
      String objectName = "<yourObjectName>";
      
      // 创建OSSClient实例。
      OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
      
      // 自定义样式。
      String style = "style/<yourCustomStyleName>";
      GetObjectRequest request = new GetObjectRequest(bucketName, objectName);
      request.setProcess(style);
      
      ossClient.getObject(request, new File("example-new.jpg"));
      
      // 关闭OSSClient。
      ossClient.shutdown();
    • 级联处理

      以下代码用于级联处理图片:

      // Endpoint以杭州为例,其它Region请按实际情况填写。
      String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
      // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
      String accessKeyId = "<yourAccessKeyId>";
      String accessKeySecret = "<yourAccessKeySecret>";
      String bucketName = "<yourBucketName>";
      String objectName = "<yourObjectName>";
      
      // 创建OSSClient实例。
      OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
      
      // 级联处理。
      String style = "image/resize,m_fixed,w_100,h_100/rotate,90";
      GetObjectRequest request = new GetObjectRequest(bucketName, objectName);
      request.setProcess(style);
      
      ossClient.getObject(request, new File("example-new.jpg"));
      
      // 关闭OSSClient。
      ossClient.shutdown();

图片处理持久化

以下代码用于图片处理持久化:
// Endpoint以杭州为例,其它Region请按实际情况填写。
String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录
// https://ram.console.aliyun.com 创建RAM账号。
String accessKeyId = "<yourAccessKeyId>";
String accessKeySecret = "<yourAccessKeySecret>";
String bucketName = "<yourBucketName>";
String sourceImage = "<yourSourceImageName>";

try {
    // 创建OSSClient实例。
    OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

    // 图片处理持久化 : 缩放
    StringBuilder sbStyle = new StringBuilder();
    Formatter styleFormatter = new Formatter(sbStyle);
    String styleType = "image/resize,m_fixed,w_100,h_100";
    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);

    // 图片处理持久化 : 裁剪
    sbStyle.delete(0, sbStyle.length());
    styleType = "image/crop,w_100,h_100,x_100,y_100,r_1";
    targetImage = "example-crop.png";
    styleFormatter.format("%s|sys/saveas,o_%s,b_%s", styleType,
            BinaryUtil.toBase64String(targetImage.getBytes()),
            BinaryUtil.toBase64String(bucketName.getBytes()));
    System.out.println(sbStyle.toString());
    request = new ProcessObjectRequest(bucketName, sourceImage, sbStyle.toString());
    processResult = ossClient.processObject(request);
    json = IOUtils.readStreamAsString(processResult.getResponse().getContent(), "UTF-8");
    processResult.getResponse().getContent().close();
    System.out.println(json);

    // 图片处理持久化 : 旋转
    sbStyle.delete(0, sbStyle.length());
    styleType = "image/rotate,90";
    targetImage = "example-rotate.png";
    styleFormatter.format("%s|sys/saveas,o_%s,b_%s", styleType,
            BinaryUtil.toBase64String(targetImage.getBytes()),
            BinaryUtil.toBase64String(bucketName.getBytes()));
    request = new ProcessObjectRequest(bucketName, sourceImage, sbStyle.toString());
    processResult = ossClient.processObject(request);
    json = IOUtils.readStreamAsString(processResult.getResponse().getContent(), "UTF-8");
    processResult.getResponse().getContent().close();
    System.out.println(json);

    // 图片处理持久化 : 锐化
    sbStyle.delete(0, sbStyle.length());
    styleType = "image/sharpen,100";
    targetImage = "example-sharpen.png";
    styleFormatter.format("%s|sys/saveas,o_%s,b_%s", styleType,
            BinaryUtil.toBase64String(targetImage.getBytes()),
            BinaryUtil.toBase64String(bucketName.getBytes()));
    request = new ProcessObjectRequest(bucketName, sourceImage, sbStyle.toString());
    processResult = ossClient.processObject(request);
    json = IOUtils.readStreamAsString(processResult.getResponse().getContent(), "UTF-8");
    processResult.getResponse().getContent().close();
    System.out.println(json);

    // 图片处理持久化 : 水印
    sbStyle.delete(0, sbStyle.length());
    styleType = "image/watermark,text_SGVsbG8g5Zu-54mH5pyN5YqhIQ";
    targetImage = "example-watermark.png";
    styleFormatter.format("%s|sys/saveas,o_%s,b_%s", styleType,
            BinaryUtil.toBase64String(targetImage.getBytes()),
            BinaryUtil.toBase64String(bucketName.getBytes()));
    request = new ProcessObjectRequest(bucketName, sourceImage, sbStyle.toString());
    processResult = ossClient.processObject(request);
    json = IOUtils.readStreamAsString(processResult.getResponse().getContent(), "UTF-8");
    processResult.getResponse().getContent().close();
    System.out.println(json);

    // 图片处理持久化 : 格式转换
    sbStyle.delete(0, sbStyle.length());
    styleType = "image/format,jpg";
    targetImage = "example-formatconvert.jpg";
    styleFormatter.format("%s|sys/saveas,o_%s,b_%s", styleType,
            BinaryUtil.toBase64String(targetImage.getBytes()),
            BinaryUtil.toBase64String(bucketName.getBytes()));
    request = new ProcessObjectRequest(bucketName, sourceImage, sbStyle.toString());
    processResult = ossClient.processObject(request);
    json = IOUtils.readStreamAsString(processResult.getResponse().getContent(), "UTF-8");
    processResult.getResponse().getContent().close();
    System.out.println(json);

} catch (Exception e) {
    e.printStackTrace();
}

图片处理工具

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