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 versie van Visual Studio 2019.
- Het Json.NET-framework, beschikbaar als NuGet-pakket.
- Als u Linux/MacOS gebruikt, kunt u deze toepassing uitvoeren met Mono.
Een Azure-resource maken
Begin met het gebruik van de Bing Visual Search-API door een van de volgende Azure-resources te maken:
- 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
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;
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>";
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; }
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
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 parametername
die is ingesteld op 'afbeelding' en de parameterfilename
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--
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}--";
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;
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; }
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
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.Gebruik een
WebRequest
voor het opslaan van de URI, contentType waarde en headers.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
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);
Stel de POST-hoofdtekst in door de grens hiervoor op te maken. Roep vervolgens
BuildFormDataStart()
enBuildFormDataEnd()
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);
Maak de
ContentType
-waarde doorCONTENT_TYPE_HEADER_PARAMS
en de grens van de formuliergegevens op te maken.var contentTypeHdrValue = string.Format(CONTENT_TYPE_HEADER_PARAMS, boundary);
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:
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); } }
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; }