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
- Eine beliebige Edition von Visual Studio 2019.
- Das Json.NET Framework, das als NuGet-Paket verfügbar ist.
- Wenn Sie Linux/MacOS verwenden, können Sie diese Anwendung mit Monoausführen.
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:
- Verfügbar über das Azure-Portal, bis Sie die Ressource löschen.
- Wählen Sie den
S9
-Tarif aus.
- 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
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;
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>";
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; }
Erstellen Sie eine Methode zum Abrufen der Binärdaten des Bilds.
static byte[] GetImageBinary(string path) { return File.ReadAllBytes(path); }
Erstellen der Formulardaten
Um ein lokales Image hochzuladen, erstellen Sie zuerst die Formulardaten, die an die API gesendet werden sollen. Die Formulardaten enthalten den
Content-Disposition
Header, denname
Parameter, der auf "image" festgelegt ist, und denfilename
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--
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}--";
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;
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; }
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
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.Verwenden Sie eine
WebRequest
, um Ihren URI, contentType-Wert und Kopfzeilen zu speichern.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
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);
Richten Sie den POST-Textkörper ein, indem Sie seine Begrenzung formatieren. Rufen Sie dann
BuildFormDataStart()
auf, undBuildFormDataEnd()
, 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);
Erstellen Sie den
ContentType
Wert, indem SieCONTENT_TYPE_HEADER_PARAMS
und die Formulardatengrenze formatieren.var contentTypeHdrValue = string.Format(CONTENT_TYPE_HEADER_PARAMS, boundary);
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 HttpClient
verwenden, 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:
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); } }
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; }