Quickstart: Afbeeldingsinzichten krijgen met behulp van de Bing Visual Search REST-API en C#

Waarschuwing

Op 30 oktober 2020 zijn de Zoeken in Bing API's verplaatst van Azure AI-services naar Zoeken in Bing Services. Deze documentatie is alleen bedoeld ter referentie. Zie de bing-documentatie voor zoeken-API voor bijgewerkte documentatie. Zie Een Zoeken in Bing-resource maken via de Azure Marketplace voor instructies over het maken van nieuwe Azure-resources voor Bing Search.

In deze quickstart wordt beschreven hoe u een afbeelding uploadt naar de Bing Visual Search-API en hoe u de inzichten weergeeft die door de API worden geretourneerd.

Vereisten

Een Azure-resource maken

Begin met het gebruik van de Bing Visual Search-API door een van de volgende Azure-resources te maken:

Bing Search v7-resource

  • Beschikbaar via de Azure-portal totdat u de resource verwijdert.
  • Controleer de prijscategorie S9.

Resource met meerdere services

  • Beschikbaar via de Azure-portal totdat u de resource verwijdert.
  • Gebruik dezelfde sleutel en hetzelfde eindpunt voor uw toepassingen, in meerdere Azure AI-services.

Een project maken en initialiseren

  1. Maak in Visual Studio een nieuwe consoleoplossing met de naam BingSearchApisQuickStart. Voeg de volgende naamruimten toe aan het hoofdcodebestand:

    using System;
    using System.Text;
    using System.Net;
    using System.IO;
    using System.Collections.Generic;
    
  2. Voeg variabelen toe voor de abonnementssleutel, het eindpunt en het pad naar de afbeelding die u wilt uploaden. Voor de uriBase-waarde kunt u het globale eindpunt in de volgende code gebruiken of het eindpunt voor het aangepaste subdomein gebruiken dat voor uw resource wordt weergegeven in 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. Maak een methode met de naam GetImageFileName() om het pad voor uw afbeelding op te halen.

    static string GetImageFileName(string path)
            {
                return new FileInfo(path).Name;
            }
    
  4. Maak een methode voor het ophalen van de binaire gegevens van de afbeelding.

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

De formuliergegevens maken

  1. Als u een lokale afbeelding wilt uploaden, moet u eerst de formuliergegevens maken om deze naar de API te verzenden. De formuliergegevens bevatten de Content-Disposition-header, de parameter name die is ingesteld op 'afbeelding' en de parameter filename die is ingesteld op de bestandsnaam van de afbeelding. De inhoud van het formulier bevat de binaire gegevens van de afbeelding. De maximale afbeeldingsgrootte die u kunt uploaden is 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. Voeg grenstekenreeksen toe om de POST-formuliergegevens op te maken. Met grenstekenreeksen worden de begin- en eindtekens en het teken voor een nieuwe regel bepaald.

    // 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. Gebruik de volgende variabelen om parameters toe te voegen aan de formuliergegevens:

    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. Maak een functie met de naam BuildFormDataStart() om het begin van de formuliergegevens te maken met behulp van de grenstekenreeksen en het afbeeldingspad.

        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. Maak een functie met de naam BuildFormDataEnd() om het einde van de formuliergegevens te maken met behulp van de grenstekenreeksen.

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

De Bing Visual Search-API aanroepen

  1. Maak een functie voor het aanroepen van het Bing Visual Search-eindpunt en het retourneren van het JSON-antwoord. In de functie zijn het begin en het einde van de formuliergegevens, een bytematrix met de afbeeldingsgegevens en een contentType-waarde opgenomen.

  2. Gebruik een WebRequest voor het opslaan van de URI, contentType waarde en headers.

  3. Gebruik request.GetRequestStream() om uw formulier- en afbeeldingsgegevens te schrijven en vervolgens het antwoord op te halen. Uw functie moet er ongeveer uitzien als de volgende code:

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

De methode Main maken

  1. Haal in de methode Main() van uw toepassing de bestandsnaam en binaire gegevens van uw afbeelding op.

    var filename = GetImageFileName(imagePath);
    var imageBinary = GetImageBinary(imagePath);
    
  2. Stel de POST-hoofdtekst in door de grens hiervoor op te maken. Roep vervolgens BuildFormDataStart() en BuildFormDataEnd() aan om de formuliergegevens te maken.

    // Set up POST body.
    var boundary = string.Format(BoundaryTemplate, Guid.NewGuid());
    var startFormData = BuildFormDataStart(boundary, filename);
    var endFormData = BuildFormDataEnd(boundary);
    
  3. Maak de ContentType-waarde door CONTENT_TYPE_HEADER_PARAMS en de grens van de formuliergegevens op te maken.

    var contentTypeHdrValue = string.Format(CONTENT_TYPE_HEADER_PARAMS, boundary);
    
  4. Haal het API-antwoord op door BingImageSearch() aan te roepen en het antwoord vervolgens weer te geven.

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

Met behulp van HttpClient

Als u HttpClient gebruikt, kunt u de klasse MultipartFormDataContent gebruiken om de formuliergegevens te maken. Gebruik de volgende secties met code om de betreffende methoden in het vorige voorbeeld te vervangen:

  1. Vervang de Main()-methode door de volgende code:

            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. Vervang de BingImageSearch()-methode door de volgende code:

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

Volgende stappen