次の方法で共有


クイック スタート: Bing Visual Search REST API と C を使用して画像の分析情報を取得する#

警告

2020 年 10 月 30 日、Bing Search API は Azure AI サービスから Bing Search Services に移行されました。 このドキュメントは参考用に提供されています。 更新されたドキュメントについては、Bing search API のドキュメントを参照してください。 Bing検索用の新しい Azure リソースを作成する手順については、「Azure Marketplace を使用して Bing Search リソースを作成するを参照してください。

このクイック スタートでは、Bing Visual Search API に画像をアップロードし、返される分析情報を表示する方法について説明します。

前提条件

Azure リソースを作成する

次のいずれかの Azure リソースを作成して、Bing Visual Search API の使用を開始します。

Bing Search v7 リソース

  • リソースを削除するまで、Azure portal から使用できます。
  • S9 価格レベルを選択します。

マルチサービス リソース

  • リソースを削除するまで、Azure portal から使用できます。
  • 複数の Azure AI サービスで、アプリケーションに同じキーとエンドポイントを使用します。

プロジェクトを作成して初期化する

  1. Visual Studio で、BingSearchApisQuickStart という名前の新しいコンソール ソリューションを作成します。 メイン コード ファイルに次の名前空間を追加します。

    using System;
    using System.Text;
    using System.Net;
    using System.IO;
    using System.Collections.Generic;
    
  2. アップロードするイメージへのサブスクリプション キー、エンドポイント、パスの変数を追加します。 uriBase 値については、次のコードでグローバル エンドポイントを使用するか、Azure portal に表示される カスタム サブドメイン エンドポイントをリソースに使用できます。

        const string accessKey = "<my_subscription_key>";
        const string uriBase = "https://api.cognitive.microsoft.com/bing/v7.0/images/visualsearch";
        static string imagePath = @"<path_to_image>";
    
  3. GetImageFileName() という名前のメソッドを作成して、イメージのパスを取得します。

    static string GetImageFileName(string path)
            {
                return new FileInfo(path).Name;
            }
    
  4. イメージのバイナリ データを取得するメソッドを作成します。

    static byte[] GetImageBinary(string path)
    {
        return File.ReadAllBytes(path);
    }
    

フォーム データをビルドする

  1. ローカル イメージをアップロードするには、まず、API に送信するフォーム データをビルドします。 フォーム データには、Content-Disposition ヘッダー、"image" に設定された name パラメーター、およびイメージのファイル名に設定された filename パラメーターが含まれます。 フォームの内容には、画像のバイナリ データが含まれています。 アップロードできる画像の最大サイズは 1 MB です。

    --boundary_1234-abcd
    Content-Disposition: form-data; name="image"; filename="myimagefile.jpg"
    
    ÿØÿà JFIF ÖÆ68g-¤CWŸþ29ÌÄøÖ‘º«™æ±èuZiÀ)"óÓß°Î= ØJ9á+*G¦...
    
    --boundary_1234-abcd--
    
  2. POST フォーム データの書式を設定する境界文字列を追加します。 境界文字列は、データの開始文字、終了文字、および改行文字を決定します。

    // Boundary strings for form data in body of POST.
    const string CRLF = "\r\n";
    static string BoundaryTemplate = "batch_{0}";
    static string StartBoundaryTemplate = "--{0}";
    static string EndBoundaryTemplate = "--{0}--";
    
  3. 次の変数を使用して、フォーム データにパラメーターを追加します。

    const string CONTENT_TYPE_HEADER_PARAMS = "multipart/form-data; boundary={0}";
    const string POST_BODY_DISPOSITION_HEADER = "Content-Disposition: form-data; name=\"image\"; filename=\"{0}\"" + CRLF +CRLF;
    
  4. 境界文字列とイメージ パスを使用してフォーム データの先頭を作成する BuildFormDataStart() という名前の関数を作成します。

        static string BuildFormDataStart(string boundary, string filename)
        {
            var startBoundary = string.Format(StartBoundaryTemplate, boundary);
    
            var requestBody = startBoundary + CRLF;
            requestBody += string.Format(POST_BODY_DISPOSITION_HEADER, filename);
    
            return requestBody;
        }
    
  5. 境界文字列を使用してフォーム データの末尾を作成する BuildFormDataEnd() という名前の関数を作成します。

        static string BuildFormDataEnd(string boundary)
        {
            return CRLF + CRLF + string.Format(EndBoundaryTemplate, boundary) + CRLF;
        }
    

Bing Visual Search API を呼び出す

  1. Bing Visual Search エンドポイントを呼び出して JSON 応答を返す関数を作成します。 この関数は、フォーム データの開始と終了、画像データを含むバイト配列、および contentType 値を受け取ります。

  2. WebRequest を使用して、URI、contentType 値、ヘッダーを格納します。

  3. request.GetRequestStream() を使用してフォームと画像のデータを書き込み、応答を取得します。 関数は次のコードのようになります。

        static string BingImageSearch(string startFormData, string endFormData, byte[] image, string contentTypeValue)
        {
            WebRequest request = HttpWebRequest.Create(uriBase);
            request.ContentType = contentTypeValue;
            request.Headers["Ocp-Apim-Subscription-Key"] = accessKey;
            request.Method = "POST";
    
            // Writes the boundary and Content-Disposition header, then writes
            // the image binary, and finishes by writing the closing boundary.
            using (Stream requestStream = request.GetRequestStream())
            {
                StreamWriter writer = new StreamWriter(requestStream);
                writer.Write(startFormData);
                writer.Flush();
                requestStream.Write(image, 0, image.Length);
                writer.Write(endFormData);
                writer.Flush();
                writer.Close();
            }
    
            HttpWebResponse response = (HttpWebResponse)request.GetResponseAsync().Result;
            string json = new StreamReader(response.GetResponseStream()).ReadToEnd();
    
            return json;
        }
    

Main メソッドを作成する

  1. アプリケーションの Main() メソッドで、イメージのファイル名とバイナリ データを取得します。

    var filename = GetImageFileName(imagePath);
    var imageBinary = GetImageBinary(imagePath);
    
  2. POST 本文を準備するために、境界をフォーマットします。 次に、BuildFormDataStart() を呼び出し、BuildFormDataEnd() してフォーム データを作成します。

    // Set up POST body.
    var boundary = string.Format(BoundaryTemplate, Guid.NewGuid());
    var startFormData = BuildFormDataStart(boundary, filename);
    var endFormData = BuildFormDataEnd(boundary);
    
  3. ContentType とフォーム データの境界を書式設定して、CONTENT_TYPE_HEADER_PARAMS 値を作成します。

    var contentTypeHdrValue = string.Format(CONTENT_TYPE_HEADER_PARAMS, boundary);
    
  4. BingImageSearch()を呼び出して API 応答を取得し、応答を出力します。

    var json = BingImageSearch(startFormData, endFormData, imageBinary, contentTypeHdrValue);
    Console.WriteLine(json);
    Console.WriteLine("enter any key to continue");
    Console.readKey();
    

HttpClient の使用

HttpClientを使用する場合は、MultipartFormDataContent クラスを使用してフォーム データをビルドできます。 前の例の対応するメソッドを置き換えるには、コードの次のセクションを使用します。

  1. Main() メソッドを次のコードに置き換えます。

            static void Main()
            {
                try
                {
                    Console.OutputEncoding = System.Text.Encoding.UTF8;
    
                    if (accessKey.Length == 32)
                    {
                        if (IsImagePathSet(imagePath))
                        {
                            var filename = GetImageFileName(imagePath);
                            Console.WriteLine("Getting image insights for image: " + filename);
                            var imageBinary = GetImageBinary(imagePath);
    
                            var boundary = string.Format(BoundaryTemplate, Guid.NewGuid());
                            var json = BingImageSearch(imageBinary, boundary, uriBase, accessKey);
    
                            Console.WriteLine("\nJSON Response:\n");
                            Console.WriteLine(JsonPrettyPrint(json));
                        }
                    }
                    else
                    {
                        Console.WriteLine("Invalid Bing Visual Search API subscription key!");
                        Console.WriteLine("Please paste yours into the source code.");
                    }
    
                    Console.Write("\nPress Enter to exit ");
                    Console.ReadLine();
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                }
            }
    
  2. BingImageSearch() メソッドを次のコードに置き換えます。

            /// <summary>
            /// Calls the Bing visual search endpoint and returns the JSON response.
            /// </summary>
            static string BingImageSearch(byte[] image, string boundary, string uri, string subscriptionKey)
            {
                var requestMessage = new HttpRequestMessage(HttpMethod.Post, uri);
                requestMessage.Headers.Add("Ocp-Apim-Subscription-Key", accessKey);
    
                var content = new MultipartFormDataContent(boundary);
                content.Add(new ByteArrayContent(image), "image", "myimage");
                requestMessage.Content = content;
    
                var httpClient = new HttpClient();
    
                Task<HttpResponseMessage> httpRequest = httpClient.SendAsync(requestMessage, HttpCompletionOption.ResponseContentRead, CancellationToken.None);
                HttpResponseMessage httpResponse = httpRequest.Result;
                HttpStatusCode statusCode = httpResponse.StatusCode;
                HttpContent responseContent = httpResponse.Content;
    
                string json = null;
    
                if (responseContent != null)
                {
                    Task<String> stringContentsTask = responseContent.ReadAsStringAsync();
                    json = stringContentsTask.Result;
                }
    
                return json;
            }
    

次のステップ