全部产品
云市场

Java SDK

更新时间:2019-09-11 16:29:54

准备工作

  1. 在安装和使用阿里云SDK前,确保您已经注册阿里云账号并生成访问访问密钥(AccessKey)。详情参考创建AccessKey

  2. 将 SDK添加到项目中
    引入 ImageSearch SDK 依赖,通过 Maven 二方库依赖的方式将 ImageSearch 的SDK加入到自己的项目中。

  1. <dependency>
  2. <groupId>com.aliyun</groupId>
  3. <artifactId>aliyun-java-sdk-imagesearch</artifactId>
  4. <version>2.0.0</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>com.aliyun</groupId>
  8. <artifactId>aliyun-java-sdk-core</artifactId>
  9. <version>[4.3.2,5.0.0)</version>
  10. </dependency>

以下二方库可根据具体情况选择是否添加:

  1. <dependency>
  2. <groupId>commons-codec</groupId>
  3. <artifactId>commons-codec</artifactId>
  4. <version>1.9</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.apache.httpcomponents</groupId>
  8. <artifactId>httpclient</artifactId>
  9. <version>4.5.3</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>com.google.code.gson</groupId>
  13. <artifactId>gson</artifactId>
  14. <version>2.8.2</version>
  15. </dependency>

创建client

  1. 设置图像搜索服务访问的 EndPoint,假定实例是在上海区域。
    1. DefaultProfile.addEndpoint( "<region>", "ImageSearch", "imagesearch.<region>.aliyuncs.com");

    说明:EndPoint填写请参考请求结构

  2. 创建 Profile。生成 IClientProfile 的对象 profile,该对象存放 AccessKeyID 和 AccessKeySecret 和地域信息。
    1. IClientProfile profile = DefaultProfile.getProfile("<region>", "<your-access-key-id>", "<your-access-key-secret>");
  3. 创建 Client。从 IClientProfile 类中再生成 IAcsClient 的对象 client,后续获得 response 都需要从 IAcsClient 中获得。
    1. IAcsClient client = new DefaultAcsClient(profile);

增加图片

  1. AddImageRequest request = new AddImageRequest();
  2. // 必填,图像搜索实例名称。
  3. request.setInstanceName("demo");
  4. // 必填,商品id,最多支持 512个字符。
  5. // 一个商品可有多张图片。
  6. request.setProductId("test");
  7. // 必填,图片名称,最多支持 512个字符。
  8. // 1. ProductId + PicName唯一确定一张图片。
  9. // 2. 如果多次添加图片具有相同的ProductId + PicName,以最后一次添加为准,前面添加的的图片将被覆盖。
  10. request.setPicName("test");
  11. // 选填,图片类目。
  12. // 1. 对于商品搜索:若设置类目,则以设置的为准;若不设置类目,将由系统进行类目预测,预测的类目结果可在Response中获取 。
  13. // 2. 对于布料、商标、通用搜索:不论是否设置类目,系统会将类目设置为88888888。
  14. request.setCategoryId(1);
  15. byte[] bytes2 = getBytes("/home/admin/demo.jpg");
  16. Base64 base64 = new Base64();
  17. String encodePicContent = base64.encodeToString(bytes2);
  18. // 必填,图片内容,Base64编码。
  19. // 最多支持 2MB大小图片以及5s的传输等待时间。当前仅支持jpg和png格式图片;
  20. // 对于商品、商标、通用图片搜索,图片长和宽的像素必须都大于等于200,并且小于等于1024;
  21. // 对于布料搜索,图片长和宽的像素必须都大于等于448,并且小于等于1024;
  22. // 图像中不能带有旋转信息。
  23. request.setPicContent(encodePicContent);
  24. // 选填,是否需要进行主体识别,默认为true。
  25. // 1.为true时,由系统进行主体识别,以识别的主体进行搜索,主体识别结果可在Response中获取。
  26. // 2. 为false时,则不进行主体识别,以整张图进行搜索。
  27. // 3.对于布料图片搜索,此参数会被忽略,系统会以整张图进行搜索。
  28. request.setCrop(true);
  29. // 选填,图片的主体区域,格式为 x1,x2,y1,y2, 其中 x1,y1 是左上角的点,x2,y2是右下角的点。
  30. // 若用户设置了Region,则不论Crop参数为何值,都将以用户输入Region进行搜索。
  31. // 对于布料图片搜索,此参数会被忽略,系统会以整张图进行搜索。
  32. request.setRegion("280,486,232,351");
  33. // 选填,整数类型属性,可用于查询时过滤,查询时会返回该字段。
  34. // 例如不同的站点的图片/不同用户的图片,可以设置不同的IntAttr,查询时通过过滤来达到隔离的目的
  35. request.setIntAttr(0);
  36. // 选填,字符串类型属性,最多支持 128个字符。可用于查询时过滤,查询时会返回该字段。
  37. request.setStrAttr("demo");
  38. // 选填,用户自定义的内容,最多支持 4096个字符。
  39. // 查询时会返回该字段。例如可添加图片的描述等文本。
  40. request.setCustomContent("1");
  41. try {
  42. AddImageResponse response = client.getAcsResponse(request)
  43. } catch (ClientException e) {
  44. // 抛出异常,例如参数无效,或者实例不可用等情况
  45. e.printStackTrace();
  46. }

查询图片

根据图片搜索图片

  1. SearchImageRequest request = new SearchImageRequest();
  2. // 必填,图像搜索实例名称。
  3. request.setInstanceName("demo");
  4. // 选填,搜索类型,取值范围:
  5. // 1. SearchByPic(默认):根据图片搜索相似图片。
  6. // 2. SearchByName,根据已添加的图片搜索相似图片。
  7. // request.setType("SearchByPic");
  8. byte[] bytes2 = getBytes("/home/admin/demo.jpg");
  9. Base64 base64 = new Base64();
  10. String encodePicContent = base64.encodeToString(bytes2);
  11. // 图片内容,Base64编码。最多支持 2MB大小图片以及5s的传输等待时间。当前仅支持jpg和png格式图片;
  12. // 对于商品、商标、通用图片搜索,图片长和宽的像素必须都大于等于200,并且小于等于1024;
  13. // 对于布料搜索,图片长和宽的像素必须都大于等于448,并且小于等于1024;
  14. // 图像中不能带有旋转信息。
  15. // 1. Type=SearchByPic时,必填
  16. // 2. Type=SearchByName时,无需填写。
  17. request.setPicContent(encodePicContent);
  18. // 选填,商品类目。
  19. // 1. 对于商品搜索:若设置类目,则以设置的为准;若不设置类目,将由系统进行类目预测,预测的类目结果可在Response中获取 。
  20. // 2. 对于布料、商标、通用搜索:不论是否设置类目,系统会将类目设置为88888888。
  21. request.setCategoryId(1);
  22. // 选填,是否需要进行主体识别,默认为true。
  23. // 1.为true时,由系统进行主体识别,以识别的主体进行搜索,主体识别结果可在Response中获取。
  24. // 2. 为false时,则不进行主体识别,以整张图进行搜索。
  25. // 3.对于布料图片搜索,此参数会被忽略,系统会以整张图进行搜索。
  26. request.setCrop(false);
  27. // 选填,图片的主体区域,格式为 x1,x2,y1,y2, 其中 x1,y1 是左上角的点,x2,y2是右下角的点。
  28. // 若用户设置了Region,则不论Crop参数为何值,都将以用户输入Region进行搜索。
  29. // 3.对于布料图片搜索,此参数会被忽略,系统会以整张图进行搜索。
  30. request.setRegion("280,486,232,351");
  31. // 选填,返回结果的数目。取值范围:1-100。默认值:10。
  32. request.setNum(2);
  33. // 选填,返回结果的起始位置。取值范围:0-499。默认值:0。
  34. request.setStart(1);
  35. // 选填,过滤条件
  36. // int_attr支持的操作符有>、>=、<、<=、=,str_attr支持的操作符有=和!=,多个条件之支持AND和OR进行连接。
  37. // 示例:
  38. // 1. 根据IntAttr过滤结果,int_attr>=100
  39. // 2. 根据StrAttr过滤结果,str_attr!="value1"
  40. // 3. 根据IntAttr和StrAttr联合过滤结果,int_attr=1000 AND str_attr="value1"
  41. request.setFilter("int_attr=1");
  42. try {
  43. SearchImageResponse response = client.getAcsResponse(request);
  44. } catch (ClientException e) {
  45. e.printStackTrace();
  46. }

根据已入库的图片(ProductId+PicName)搜索图片

  1. SearchImageRequest request = new SearchImageRequest();
  2. // 必填,图像搜索实例名称。
  3. request.setInstanceName("demo");
  4. // 选填,搜索类型,取值范围:
  5. // 1. SearchByPic(默认):根据图片搜索相似图片。
  6. // 2. SearchByName,根据已添加的图片搜索相似图片。
  7. request.setType("SearchByName");
  8. // 商品id。
  9. // 1. Type=SearchByPic时,无需填写
  10. // 2. Type=SearchByName时,必填,已添加图片的ProductId。
  11. request.setProductId("test");
  12. // 图片名称。
  13. // 1. Type=SearchByPic时,无需填写
  14. // 2. Type=SearchByName时,必填,已添加图片的PicName。
  15. request.setPicName("test");
  16. // 选填,商品类目。
  17. // 1. 对于商品搜索:若设置类目,则以设置的为准;若不设置类目,将由系统进行类目预测,预测的类目结果可在Response中获取 。
  18. // 2. 对于布料、商标、通用搜索:不论是否设置类目,系统会将类目设置为88888888。
  19. request.setCategoryId(1);
  20. // 选填,是否需要进行主体识别,默认为true。
  21. // 1.为true时,由系统进行主体识别,以识别的主体进行搜索,主体识别结果可在Response中获取。
  22. // 2. 为false时,则不进行主体识别,以整张图进行搜索。
  23. // 对于布料图片搜索,此参数会被忽略,系统会以整张图进行搜索。
  24. request.setCrop(false);
  25. // 选填,图片的主体区域,格式为 x1,x2,y1,y2, 其中 x1,y1 是左上角的点,x2,y2是右下角的点。
  26. // 若用户设置了Region,则不论Crop参数为何值,都将以用户输入Region进行搜索。
  27. // 对于布料图片搜索,此参数会被忽略,系统会以整张图进行搜索。
  28. request.setRegion("280,486,232,351");
  29. // 选填,返回结果的数目。取值范围:1-100。默认值:10。
  30. request.setNum(2);
  31. // 选填,返回结果的起始位置。取值范围:0-499。默认值:0。
  32. request.setStart(1);
  33. // 选填,过滤条件
  34. // int_attr支持的操作符有>、>=、<、<=、=,str_attr支持的操作符有=和!=,多个条件之支持AND和OR进行连接。
  35. // 示例:
  36. // 1. 根据IntAttr过滤结果,int_attr>=100
  37. // 2. 根据StrAttr过滤结果,str_attr!="value1"
  38. // 3. 根据IntAttr和StrAttr联合过滤结果,int_attr=1000 AND str_attr="value1"
  39. request.setFilter("int_attr=1");
  40. try {
  41. SearchImageResponse response = client.getAcsResponse(request);
  42. } catch (ClientException e) {
  43. e.printStackTrace();
  44. }

删除图片

  1. DeleteImageRequest request = new DeleteImageRequest();
  2. // 必填,图像搜索实例名称。
  3. request.setInstanceName("demo");
  4. // 必填,商品id。
  5. request.setProductId("test");
  6. // 选填,图片名称。若不指定本参数,则删除ProductId下所有图片;若指定本参数,则删除ProductId+PicName指定的图片。
  7. request.setPicName("test");
  8. try {
  9. DeleteImageResponse response = client.getAcsResponse(request);
  10. } catch (ClientException e) {
  11. e.printStackTrace();
  12. }

附录

获取图片二进制数组方法

  1. private static byte[] getBytes(String filePath) {
  2. byte[] buffer = null;
  3. try {
  4. File file = new File(filePath);
  5. FileInputStream fis = new FileInputStream(file);
  6. // picture max size is 2MB
  7. ByteArrayOutputStream bos = new ByteArrayOutputStream(2000 * 1024);
  8. byte[] b = new byte[1000];
  9. int n;
  10. while ((n = fis.read(b)) != -1) {
  11. bos.write(b, 0, n);
  12. }
  13. fis.close();
  14. bos.close();
  15. buffer = bos.toByteArray();
  16. } catch (FileNotFoundException e) {
  17. e.printStackTrace();
  18. } catch (IOException e) {
  19. e.printStackTrace();
  20. }
  21. return buffer;
  22. }

SDK使用示例下载

Java SDK使用示例,点击下载