Megosztás a következőn keresztül:


Rövid útmutató: Képelemzések lekérése a Bing Visual Search REST API és a C használatával#

Figyelmeztetés

2020. október 30-án a Bing Search API-k átkerültek az Azure AI-szolgáltatásokból a Bing Search-szolgáltatásokba. Ez a dokumentáció csak referenciaként érhető el. A frissített dokumentációt a Bing search API dokumentációjában találja. Az új Azure-erőforrások Bing-kereséshez való létrehozásával kapcsolatos utasításokért lásd: Bing Search-erőforrás létrehozása a Azure Marketplace keresztül.

Ez a rövid útmutató bemutatja, hogyan tölthet fel képet a Bing Visual Search API-ba, és tekintheti meg a visszaadott megállapításokat.

Előfeltételek

Azure-erőforrás létrehozása

Kezdje el használni a Bing Visual Search API-t az alábbi Azure-erőforrások egyikének létrehozásával:

Bing Search v7-erőforrás

  • A Azure Portal keresztül érhető el, amíg el nem törli az erőforrást.
  • Válassza ki a tarifacsomagot S9 .

Többszolgáltatásos erőforrás

  • A Azure Portal keresztül érhető el, amíg el nem törli az erőforrást.
  • Használja ugyanazt a kulcsot és végpontot az alkalmazásokhoz több Azure AI-szolgáltatásban.

Projekt létrehozása és inicializálása

  1. A Visual Studióban hozzon létre egy BingSearchApisQuickStart nevű új konzolmegoldást. Adja hozzá a következő névtereket a fő kódfájlhoz:

    using System;
    using System.Text;
    using System.Net;
    using System.IO;
    using System.Collections.Generic;
    
  2. Adjon hozzá változókat az előfizetői azonosítóhoz, a végponthoz és az elérési úthoz a feltölteni kívánt rendszerképhez. uriBase Az értékhez használhatja a globális végpontot a következő kódban, vagy használhatja az erőforráshoz tartozó Azure Portal megjelenített egyéni altartományvégpontot.

        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. Hozzon létre egy nevű GetImageFileName() metódust a rendszerkép elérési útjának lekéréséhez.

    static string GetImageFileName(string path)
            {
                return new FileInfo(path).Name;
            }
    
  4. Hozzon létre egy metódust a kép bináris adatainak lekéréséhez.

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

Űrlapadatok létrehozása

  1. Helyi rendszerkép feltöltéséhez először hozza létre az űrlapadatokat, és küldje el az API-nak. Az űrlapadatok tartalmazzák a Content-Disposition fejlécet, a name paramétert "image" értékre, a paramétert pedig a filename kép fájlnevére. Az űrlap tartalma tartalmazza a kép bináris adatait. A feltölthető képek maximális mérete 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. Adjon hozzá határsztringeket a POST űrlap adatainak formázásához. A határsztringek határozzák meg az adatok kezdő, záró és új vonal karaktereit.

    // 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. Az alábbi változókkal adhat hozzá paramétereket az űrlapadatokhoz:

    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. Hozzon létre egy nevű BuildFormDataStart() függvényt az űrlapadatok kezdővonalának létrehozásához a határsztringek és a kép elérési útja használatával.

        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. Hozzon létre egy nevű BuildFormDataEnd() függvényt az űrlapadatok végének létrehozásához a határsztringek használatával.

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

A Bing Visual Search API meghívása

  1. Hozzon létre egy függvényt a Bing Visual Search-végpont meghívásához és a JSON-válasz visszaadásához. A függvény az űrlapadatok kezdetét és végét, a képadatokat tartalmazó bájttömböt és egy contentType értéket vesz fel.

  2. Az a WebRequest használatával tárolhatja az URI-t, a contentType értéket és a fejléceket.

  3. Segítségével request.GetRequestStream() megírhatja az űrlap- és képadatokat, majd lekérheti a választ. A függvénynek az alábbi kódhoz hasonlónak kell lennie:

        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;
        }
    

A Main metódus létrehozása

  1. Main() Az alkalmazás metódusában kérje le a kép fájlnevét és bináris adatait.

    var filename = GetImageFileName(imagePath);
    var imageBinary = GetImageBinary(imagePath);
    
  2. Állítsa be a POST törzset a határ formázásával. Ezután hívja meg BuildFormDataStart() a és BuildFormDataEnd() a parancsot az űrlapadatok létrehozásához.

    // Set up POST body.
    var boundary = string.Format(BoundaryTemplate, Guid.NewGuid());
    var startFormData = BuildFormDataStart(boundary, filename);
    var endFormData = BuildFormDataEnd(boundary);
    
  3. Hozza létre az ContentType értéket formázással CONTENT_TYPE_HEADER_PARAMS és az űrlap adathatárával.

    var contentTypeHdrValue = string.Format(CONTENT_TYPE_HEADER_PARAMS, boundary);
    
  4. Kérje le az API-választ a meghívásával BingImageSearch(), majd nyomtassa ki a választ.

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

HttpClient használata

Ha a parancsot használja HttpClient, a MultipartFormDataContent osztály használatával hozhatja létre az űrlapadatokat. Az előző példában szereplő megfelelő metódusok lecseréléséhez használja a kód alábbi szakaszait:

  1. Cserélje le az Main() metódust az alábbi kódra:

            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. Cserélje le az BingImageSearch() metódust az alábbi kódra:

            /// <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;
            }
    

Következő lépések