edit-icon download-icon

Java SDK

最終更新日: Jul 02, 2019

準備

  1. Alibaba Cloud SDK をインストールして使用する前に、Alibaba Cloud アカウントを登録して AccessKey を生成したことを確認します。詳細は、AccessKey の作成をご参照ください。

  2. プロジェクトに SDK を追加します。
    Maven 依存関係を追加して Image Search 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>

クライアントの作成

  1. Image Search サービスのアクセス用にエンドポイントを設定します。例では、インスタンスが中国 (上海) リージョンにあると仮定して追加しています。

    1. DefaultProfile.addEndpoint( "<region>", "ImageSearch", "imagesearch.<region>.aliyuncs.com");

    エンドポイント一覧

  2. プロファイルを作成します。IClientProfile のオブジェクトプロファイルを生成します。このオブジェクトには、AccessKeyID と AccessKeySecret、およびリージョン情報が格納されています。

    1. IClientProfile profile = DefaultProfile.getProfile("<region>", "<your-access-key-id>", "<your-access-key-secret>");
  3. クライアントを作成します。IClientProfile クラスから IAcsClient のオブジェクトクライアントを生成し、その後の応答は IAcsClient から取得する必要があります。
    1. IAcsClient client = new DefaultAcsClient(profile);

画像の追加

  1. AddImageRequest request = new AddImageRequest();
  2. // 入力必須。Image Search インスタンス名。
  3. request.setInstanceName("demo");
  4. // 入力必須。商品 ID、最大 512 文字をサポートします。
  5. // 1 つの商品に複数の画像を含めることができます。
  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. // 最大 2 MB サイズの画像と 5 秒の送信待ち時間をサポートします。現在 jpg および png の画像形式のみサポートしています。
  20. // 縦と横の画素数は共に 200 以上 1024 以下でなければならず、画像に回転情報を含めることはできません。
  21. request.setPicContent(encodePicContent);
  22. // 入力任意。被写体認識の要否、デフォルトは true です。
  23. // 1. true の場合、システムにより被写体認識が行われ、認識された被写体による検索が実行されます。被写体認識結果を Response で取得できます。
  24. // 2. false の場合、被写体は認識されず、画像全体として検索されます。
  25. request.setCrop(true);
  26. // 入力任意。x1、x2、y1、y2 の形式で表される画像の被写体範囲、x1、y1 は左上の点、x2、y2 は右下の点です。
  27. // ユーザーが Region を設定した場合、Crop パラメーターの値に関わらず、その Region で検索を実行します。
  28. request.setRegion("280,486,232,351");
  29. // 入力任意。検索時のフィルタリングに使用できる整数型属性、検索された際にこのフィールドが返されます。
  30. // たとえば、サイトの画像 / ユーザーの画像ごとに IntAttr をそれぞれ設定することができ、検索された際にフィルタリングすることで分離できます。
  31. request.setIntAttr(0);
  32. // 入力任意。文字列型属性、最大 128 文字をサポートします。検索された際のフィルタリングに使用できます。検索された際にこのフィールドが返されます。
  33. request.setStrAttr("demo");
  34. // 入力任意。ユーザーがカスタマイズした内容、最大 4096 文字をサポートします。
  35. // 検索された際にこのフィールドが返されます。たとえば、画像の説明などのテキストを追加できます。
  36. request.setCustomContent("1");
  37. try {
  38. AddImageResponse response = client.getAcsResponse(request)
  39. } catch (ClientException e) {
  40. // パラメーターが無効、インスタンスが利用不可などの例外をスローします。
  41. e.printStackTrace();
  42. }

画像の検索

画像から画像を検索します。

  1. SearchImageRequest request = new SearchImageRequest();
  2. // 入力必須。Image Search インスタンス名。
  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 でエンコードした画像コンテンツ。最大 2 MB サイズの画像と 5 秒の送信待ち時間をサポートします。現在 jpg および png の画像形式のみサポートしています。
  12. // 縦と横の画素数は共に 200 以上 1024 以下でなければならず、画像に回転情報を含めることはできません。
  13. // 1. Type=SearchByPic の場合、入力する必要があります。
  14. // 2. Type=SearchByName の場合、入力する必要はありません。
  15. request.setPicContent(encodePicContent);
  16. // 入力任意。商品カテゴリ。
  17. // 1. 商品検索の場合:カテゴリが設定されている場合はその設定が優先され、設定されていない場合はシステムがカテゴリ予測を実行し、予測されたカテゴリの結果を Response で取得できます。
  18. // 2. ユニバーサル検索の場合:カテゴリが設定されているかどうかに関わらず、システムによりカテゴリが 88888888 に設定されます。
  19. request.setCategoryId(1);
  20. // 入力任意。被写体認識の要否、デフォルトは true です。
  21. // 1. true の場合、システムにより被写体認識が行われ、認識された被写体による検索が実行されます。被写体認識結果を Response で取得できます。
  22. // 2. false の場合、被写体は認識されず、画像全体として検索されます。
  23. request.setCrop(false);
  24. // 入力任意。x1、x2、y1、y2 の形式で表される画像の被写体範囲、x1、y1 は左上の点、x2、y2 は右下の点です。
  25. // ユーザーが Region を設定した場合、Crop パラメーターの値に関わらず、その Region で検索を実行します。
  26. request.setRegion("280,486,232,351");
  27. // 入力任意。戻り値の数。有効範囲:1〜100、デフォルト:10
  28. request.setNum(2);
  29. // 入力任意。戻り値の開始位置。有効範囲:0〜499、デフォルト:0
  30. request.setStart(1);
  31. // 入力任意。フィルター条件
  32. // int_attr でサポートされている演算子は >、>=、<、<=、=、str_attr でサポートされている演算子は = と != で、複数条件は AND と OR で接続します。
  33. // 例:
  34. // 1. IntAttr で結果をフィルタリングする場合、int_attr>=100
  35. // 2. StrAttr で結果をフィルタリングする場合、str_attr!="value1"
  36. // 3. IntAttr と StrAttr を組み合わせて結果をフィルタリングする場合、int_attr=1000 AND str_attr="value1"
  37. request.setFilter("int_attr=1");
  38. try {
  39. SearchImageResponse response = client.getAcsResponse(request);
  40. } catch (ClientException e) {
  41. e.printStackTrace();
  42. }

すでにストレージにある画像(ProductId+PicName)をベースに画像を検索します。

  1. SearchImageRequest request = new SearchImageRequest();
  2. // 入力必須。Image Search インスタンス名。
  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. request.setCrop(false);
  24. // 入力任意。x1、x2、y1、y2 の形式で表される画像の被写体範囲、x1、y1 は左上の点、x2、y2 は右下の点です。
  25. // ユーザーが Region を設定した場合、Crop パラメーターの値に関わらず、その Region で検索を実行します。
  26. request.setRegion("280,486,232,351");
  27. // 入力任意。戻り値の数。有効範囲:1〜100、デフォルト:10
  28. request.setNum(2);
  29. // 入力任意。戻り値の開始位置。有効範囲:0〜499、デフォルト:0
  30. request.setStart(1);
  31. // 入力任意。フィルター条件
  32. // int_attr でサポートされている演算子は >、>=、<、<=、=、str_attr でサポートされている演算子は = と != で、複数条件は AND と OR で接続します。
  33. // 例:
  34. // 1. IntAttr で結果をフィルタリングする場合、int_attr>=100
  35. // 2. StrAttr で結果をフィルタリングする場合、str_attr!="value1"
  36. // 3. IntAttr と StrAttr を組み合わせて結果をフィルタリングする場合、int_attr=1000 AND str_attr="value1"
  37. request.setFilter("int_attr=1");
  38. try {
  39. SearchImageResponse response = client.getAcsResponse(request);
  40. } catch (ClientException e) {
  41. e.printStackTrace();
  42. }

画像の削除

  1. DeleteImageRequest request = new DeleteImageRequest();
  2. // 入力必須。Image Search インスタンス名。
  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 使用例は、こちらをクリックしてダウンロードしてください。