图片处理是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:

    #include "oss_api.h"
    #include "aos_http_io.h"
    const char *endpoint = "<yourEndpoint>";
    const char *access_key_id = "<yourAccessKeyId>";
    const char *access_key_secret = "<yourAccessKeySecret>";
    const char *bucket_name = "<yourBucketName>";
    const char *object_name = "<yourObjectName>";
    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);
        aos_str_set(&options->config->access_key_id, access_key_id);
        aos_str_set(&options->config->access_key_secret, 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_table_t *params = NULL;
        aos_http_request_t *req;
        char *url_str;
        apr_time_t now;
        int64_t expire_time; 
        aos_str_set(&bucket, bucket_name);
        aos_str_set(&object, object_name);
        /* 图片处理。*/
        params = aos_table_make(pool, 1);
        apr_table_set(params, OSS_PROCESS, "image/resize,m_fixed,w_100,h_100");
        req = aos_http_request_create(pool);
        req->method = HTTP_GET;
        req->query_params = params;
        /* 过期时间(expire_time),单位为秒。*/
        now = apr_time_now();
        expire_time = now / 1000000 + 10 * 60;
        /* 生成签名url。*/
        url_str = oss_gen_signed_url(oss_client_options, &bucket, &object, expire_time, req);
        printf("url: %s\n", url_str);
        /* 释放该内存池,相当于释放了请求过程中各资源分配的内存。*/
        aos_pool_destroy(pool);
        /* 释放之前分配的全局资源。 */
        aos_http_io_deinitialize();
        return 0;
    }
  • SDK访问

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

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

    • 基础操作

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

      #include "oss_api.h"
      #include "aos_http_io.h"
      const char *endpoint = "<yourEndpoint>";
      const char *access_key_id = "<yourAccessKeyId>";
      const char *access_key_secret = "<yourAccessKeySecret>";
      const char *bucket_name = "<yourBucketName>";
      const char *object_name = "<yourObjectName>";
      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);
          aos_str_set(&options->config->access_key_id, access_key_id);
          aos_str_set(&options->config->access_key_secret, 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);
          apr_table_set(params, OSS_PROCESS, "image/resize,m_fixed,w_100,h_100");
          /* 下载处理后的图片到本地文件。*/
          aos_str_set(&file, "example-resize.jpg");
          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");  
          }
          /* 裁剪 */
          params = aos_table_make(pool, 1);
          apr_table_set(params, OSS_PROCESS, "image/crop,w_100,h_100,x_100,y_100,r_1");
          /* 下载处理后的图片到本地文件。*/
          aos_str_set(&file, "example-crop.jpg");
          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");  
          }
          /* 旋转 */
          params = aos_table_make(pool, 1);
          apr_table_set(params, OSS_PROCESS, "image/rotate,90");
          /* 下载处理后的图片到本地文件。*/
          aos_str_set(&file, "example-rotate.jpg");
          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");  
          }
          /* 锐化 */
          params = aos_table_make(pool, 1);
          apr_table_set(params, OSS_PROCESS, "image/sharpen,100");
          /* 下载处理后的图片到本地文件。*/
          aos_str_set(&file, "example-sharpen.jpg");
          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");  
          }
          /* 水印 */
          params = aos_table_make(pool, 1);
          apr_table_set(params, OSS_PROCESS, "image/watermark,text_SGVsbG8g5Zu-54mH5pyN5YqhIQ");
          /* 下载处理后的图片到本地文件。*/
          aos_str_set(&file, "example-watermark.jpg");
          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");  
          }
          /* 格式转换 */
          params = aos_table_make(pool, 1);
          apr_table_set(params, OSS_PROCESS, "image/format,png");
          /* 下载处理后的图片到本地文件。*/
          aos_str_set(&file, "example-format.png");
          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");  
          }
          /* 获取图片信息 */
          params = aos_table_make(pool, 1);
          apr_table_set(params, OSS_PROCESS, "image/info");
          /* 下载处理后的图片到本地文件。*/
          aos_str_set(&file, "example-info.txt");
          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;
      }
    • 自定义样式

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

      #include "oss_api.h"
      #include "aos_http_io.h"
      const char *endpoint = "<yourEndpoint>";
      const char *access_key_id = "<yourAccessKeyId>";
      const char *access_key_secret = "<yourAccessKeySecret>";
      const char *bucket_name = "<yourBucketName>";
      const char *object_name = "<yourObjectName>";
      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);
          aos_str_set(&options->config->access_key_id, access_key_id);
          aos_str_set(&options->config->access_key_secret, 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);
          apr_table_set(params, OSS_PROCESS, "style/<yourCustomStyleName>");
          /* 下载处理后的图片到本地文件。*/
          aos_str_set(&file, "example-custom-style.jpg");
          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;
      }
    • 级联处理

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

      #include "oss_api.h"
      #include "aos_http_io.h"
      const char *endpoint = "<yourEndpoint>";
      const char *access_key_id = "<yourAccessKeyId>";
      const char *access_key_secret = "<yourAccessKeySecret>";
      const char *bucket_name = "<yourBucketName>";
      const char *object_name = "<yourObjectName>";
      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);
          aos_str_set(&options->config->access_key_id, access_key_id);
          aos_str_set(&options->config->access_key_secret, 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);
          apr_table_set(params, OSS_PROCESS, "image/resize,m_fixed,w_100,h_100/rotate,90");
          /* 下载处理后的图片到本地文件。*/
          aos_str_set(&file, "example-cascade.jpg");
          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;
      }

图片处理工具

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