您可以通过URL和SDK两种方式对图片进行处理。
通过URL处理图片
操作场景
开通对象存储ZOS并上传图片后,您可在浏览器地址输入URL处理图片。
通过URL处理图片有两种方式:针对公共读对象,可直接在URL中添加参数处理图片;针对私有对象,通过SDK预签名接口生成URL后拼接图片处理请求。
注意通过URL访问图片时,浏览器会默认下载图片。
公共读对象
URL格式
https://bucket-name.endpoint/object-name?x-zos-process=image/action,param_value
https://bucket-name.endpoint
:Bucket外网访问地址。其中,bucket-name为桶名,endpoint为桶对应的地域域名。object-name
:想要访问的图片名称。x-zos-process=image/
:固定参数,表示该请求是图片处理相关请求。action,param_value
:图片处理的操作(action)、参数(param)和值(value),用于定义图片处理的方式。多个操作以正斜线(/)隔开,操作后的不同参数通过逗号(,)隔开,参数后接下划线(_)并拼接参数具体的值。ZOS按图片处理参数的顺序处理图片。例如,“image/resize,p_30/rotate,90”表示将图片先按比例缩放至原图的30%,再将图片旋转90°。支持的参数,请参见图片处理参数。
示例
https://bucket-test.changsha42.zos.ctyun.cn/test.jpg?x-zos-process=image/resize,w_500,h_500/rotate,180
上述请求会对长沙42资源池的bucket-test桶中的test.jpg图片对象,进行图片处理操作,并将处理后的图片下载到本地。图片处理的具体操作为:首先将图片缩放为500 px*500 px,然后再将其旋转180°。
私有对象
URL格式
通过SDK的generate_presigned_url预签名接口,生成指定对象的get_object访问权限,然后在其生成的URL后面拼接图片处理请求。URL格式为:
http://endpoint/bucketname/objectname?AWSAccessKeyId=xxx&Expires=xxx&Signature=xxx&x-zos-process=image/action,param_value
http://endpoint/bucketname/objectname?AWSAccessKeyId=xxx&Expires=xxx&Signature=xxx
:使用SDK预签名生成的URL。x-zos-process=image/
:固定参数,表示该请求是图片处理相关请求。action,param_value
:图片处理的操作(action)、参数(param)和值(value),用于定义图片处理的方式。多个操作以正斜线(/)隔开,操作后的不同参数通过逗号(,)隔开,参数后接下划线(_)并拼接参数具体的值。ZOS按图片处理参数的顺序处理图片。例如,“image/resize,p_30/rotate,90”表示将图片先按比例缩放至原图的30%,再将图片旋转90°。支持的参数,请参见图片处理参数。
示例
http://ip:port/bucket/mypic.jpg?AWSAccessKeyId=xxx&Expires=xxx&Signature=xxx&x-zos-process=image/resize,w_500,h_500/rotate,180
上述请求为对bucket桶中的mypic.jpg图片对象进行缩放和旋转操作:首先将图片缩放为500 px*500 px,然后再将其旋转180°。
注意当前拼接请求操作仅支持v2认证方式,v4认证方式拼接URL后会导致请求失败。具体SDK预签名方式参考对应的SDK开发者文档。
通过SDK处理图片
操作场景
您可以通过在SDK中添加参数的方式来处理图片。
示例
以java为例,介绍了图片处理的简单使用方式,更多语言的图片处理SDK请参考开发者文档。
import com.amazonaws.ClientConfiguration;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.client.builder.AwsClientBuilder;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.Protocol;
import com.amazonaws.services.s3.model.GetObjectRequest;
import com.amazonaws.services.s3.model.S3Object;
import java.io.*;
import java.util.Base64;
public class picturedemo {
// 访问凭证,填写用户的AK与SK
public static String ACCESS_KEY = "ACCESS_KEY";
public static String SECRET_KEY = "SECRET_KEY";
// endpoint为控制台域名信息中的终端节点
public static String END_POINT = "END_POINT";
// 填写桶名
public static String BUCKET_NAME = "BUCKET_NAME";
// 填写待操作图片对象完整路径
public static String OBJ_KEY = "OBJ_KEY";
// 填写处理后图片对象待保存至本地的路径
public static String SAVE_PATH = "./test.png";
public static void main(String[] args) {
AmazonS3 s3Client;
// 当使用HTTPS协议且采用自签名认证时,需关闭证书检查
// System.setProperty("com.amazonaws.sdk.disableCertChecking", "true");
// 使用凭据和配置建立连接
AWSCredentials credentials = new BasicAWSCredentials(ACCESS_KEY, SECRET_KEY);
ClientConfiguration awsClientConfig = new ClientConfiguration();
// 使用V2签名时,采用"S3SignerType"
awsClientConfig.setSignerOverride("S3SignerType");
// 使用V4签名时,采用"AWSS3V4SignerType"
// awsClientConfig.setSignerOverride("AWSS3V4SignerType");
// 连接默认使用HTTPS协议,使用HTTP协议连接时需要显式指定
awsClientConfig.setProtocol(Protocol.HTTP);
s3Client = AmazonS3ClientBuilder.standard()
.withCredentials(new AWSStaticCredentialsProvider(credentials))
.withClientConfiguration(awsClientConfig)
.withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(END_POINT, ""))
.disableChunkedEncoding()
.build();
GetObjectRequest request = new GetObjectRequest(BUCKET_NAME, OBJ_KEY);
// 图片处理具体操作,将图片在(10,10)处裁剪300*200大小的矩形,再旋转90°
String imageop = "image/crop,w_300,h_200,x_10,y_10/rotate,90";
request.setZosProcess(imageop);
S3Object result = s3Client.getObject(request);
System.out.print("=====request success=====\n");
// 将下载的图片保存到本地
try {
InputStream in = result.getObjectContent();
File outputFile = new File(SAVE_PATH);
FileOutputStream outputStream = new
FileOutputStream(outputFile);
byte[] read_buf = new byte[1024 * 1024];
int read_len = 0;
while ((read_len = in.read(read_buf)) > 0) {
outputStream.write(read_buf, 0, read_len);
}
in.close();
outputStream.close();
} catch (IOException e){
e.printStackTrace();
}
}
}