Freigeben über


Schnellstart: Abrufen von Bildinformationen mithilfe von der Bing Visual Search REST-API und C#

Warnung

Am 30. Oktober 2020 wurden die Bing Search-APIs von Azure AI-Diensten zu Bing Search Services verschoben. Diese Dokumentation wird nur zur Referenz bereitgestellt. Eine aktualisierte Dokumentation finden Sie in der Dokumentation zu den Bing-Suche-APIs. Anweisungen zum Erstellen neuer Azure-Ressourcen für die Bing-Suche finden Sie unter Erstellen einer Ressource für die Bing-Suche über Azure Marketplace.

In dieser Schnellstartanleitung wird veranschaulicht, wie Sie ein Bild in die Bing Visual Search-API hochladen und die zurückgegebenen Erkenntnisse anzeigen.

Voraussetzungen

Erstellen einer Azure-Ressource

Beginnen Sie mit der Verwendung der API für die visuelle Bing-Suche, indem Sie eine der folgenden Azure-Ressourcen erstellen:

Ressource für Bing-Suche v7

  • Verfügbar über das Azure-Portal, bis Sie die Ressource löschen.
  • Wählen Sie den S9-Tarif aus.

Ressource für mehrere Dienste

  • Verfügbar über das Azure-Portal, bis Sie die Ressource löschen.
  • Verwenden Sie denselben Schlüssel und Endpunkt für Ihre Anwendungen in mehreren Azure AI-Diensten.

Erstellen und Initialisieren eines Projekts

  1. Erstellen Sie in Visual Studio eine neue Konsolenlösung namens BingSearchApisQuickStart. Fügen Sie der Hauptcodedatei die folgenden Namespaces hinzu:

    using System;
    using System.Text;
    using System.Net;
    using System.IO;
    using System.Collections.Generic;
    
  2. Fügen Sie Variablen für Ihren Abonnementschlüssel, Endpunkt und Pfad zum Bild hinzu, das Sie hochladen möchten. Für den uriBase Wert können Sie den globalen Endpunkt im folgenden Code verwenden oder die benutzerdefinierte Unterdomäne Endpunkt verwenden, der im Azure-Portal für Ihre Ressource angezeigt wird.

        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. Erstellen Sie eine Methode mit dem Namen GetImageFileName(), um den Pfad für Ihr Bild abzurufen.

    static string GetImageFileName(string path)
            {
                return new FileInfo(path).Name;
            }
    
  4. Erstellen Sie eine Methode zum Abrufen der Binärdaten des Bilds.

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

Erstellen der Formulardaten

  1. Um ein lokales Image hochzuladen, erstellen Sie zuerst die Formulardaten, die an die API gesendet werden sollen. Die Formulardaten enthalten den Content-Disposition Header, den name Parameter, der auf "image" festgelegt ist, und den filename Parameter, der auf den Dateinamen des Bilds festgelegt ist. Der Inhalt des Formulars enthält die Binärdaten des Bilds. Die maximale Bildgröße, die Sie hochladen können, beträgt 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. Fügen Sie Begrenzungszeichenfolgen zum Formatieren der POST-Formulardaten hinzu. Begrenzungszeichenfolgen bestimmen die Anfangs-, End- und Neuzeilenzeichen für die Daten.

    // 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. Verwenden Sie die folgenden Variablen, um Parameter zu den Formulardaten hinzuzufügen:

    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. Erstellen Sie eine Funktion mit dem Namen BuildFormDataStart(), um den Anfang der Formulardaten mithilfe der Begrenzungszeichenfolgen und des Bildpfads zu erstellen.

        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. Erstellen Sie eine Funktion mit dem Namen BuildFormDataEnd(), um das Ende der Formulardaten mithilfe der Begrenzungszeichenfolgen zu erstellen.

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

Aufrufen der Bing Visual Search-API

  1. Erstellen Sie eine Funktion, um den Bing Visual Search-Endpunkt aufzurufen und die JSON-Antwort zurückzugeben. Die Funktion übernimmt den Anfang und das Ende der Formulardaten, ein Bytearray, das die Bilddaten enthält, und einen contentType Wert.

  2. Verwenden Sie eine WebRequest, um Ihren URI, contentType-Wert und Kopfzeilen zu speichern.

  3. Verwenden Sie request.GetRequestStream(), um Formular- und Bilddaten zu schreiben und dann die Antwort zu erhalten. Ihre Funktion sollte dem folgenden Code ähneln:

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

Erstellen Sie die Main-Methode

  1. Rufen Sie in der Main()-Methode Ihrer Anwendung den Dateinamen und die Binärdaten Ihres Bilds ab.

    var filename = GetImageFileName(imagePath);
    var imageBinary = GetImageBinary(imagePath);
    
  2. Richten Sie den POST-Textkörper ein, indem Sie seine Begrenzung formatieren. Rufen Sie dann BuildFormDataStart() auf, und BuildFormDataEnd(), um die Formulardaten zu erstellen.

    // Set up POST body.
    var boundary = string.Format(BoundaryTemplate, Guid.NewGuid());
    var startFormData = BuildFormDataStart(boundary, filename);
    var endFormData = BuildFormDataEnd(boundary);
    
  3. Erstellen Sie den ContentType Wert, indem Sie CONTENT_TYPE_HEADER_PARAMS und die Formulardatengrenze formatieren.

    var contentTypeHdrValue = string.Format(CONTENT_TYPE_HEADER_PARAMS, boundary);
    
  4. Rufen Sie die API-Antwort ab, indem Sie BingImageSearch()aufrufen und dann die Antwort drucken.

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

Verwenden von HttpClient

Wenn Sie HttpClientverwenden, können Sie die MultipartFormDataContent Klasse verwenden, um die Formulardaten zu erstellen. Verwenden Sie die folgenden Codeabschnitte, um die entsprechenden Methoden im vorherigen Beispiel zu ersetzen:

  1. Ersetzen Sie die Main()-Methode durch folgenden 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. Ersetzen Sie die BingImageSearch()-Methode durch folgenden 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;
            }
    

Nächste Schritte