Snabbstart: Hämta bildinsikter med rest-API:et för visuell sökning i Bing och C#
Varning
Den 30 oktober 2020 flyttade Bing-sökning API:er från Azure AI-tjänster till Bing-sökning Services. Den här dokumentationen tillhandahålls endast som referens. Uppdaterad dokumentation finns i dokumentationen för API:et för Bing-sökning. Anvisningar om hur du skapar nya Azure-resurser för Bing-sökning finns i Skapa en Bing-sökning resurs via Azure Marketplace.
Den här snabbstarten visar hur du laddar upp en bild till API:et för visuell sökning i Bing och visar de insikter som den returnerar.
Förutsättningar
- Alla utgåvor av Visual Studio 2019.
- Det Json.NET ramverket, tillgängligt som ett NuGet-paket.
- Om du använder Linux/MacOS kan du köra det här programmet med Mono.
Skapa en Azure-resurs
Börja använda API:et för visuell sökning i Bing genom att skapa någon av följande Azure-resurser:
- Tillgänglig via Azure Portal tills du tar bort resursen.
-
S9
Välj prisnivå.
- Tillgänglig via Azure Portal tills du tar bort resursen.
- Använd samma nyckel och slutpunkt för dina program i flera Azure AI-tjänster.
Skapa och initiera ett projekt
Skapa en ny konsollösning med namnet BingSearchApisQuickStart i Visual Studio. Lägg till följande namnområden i huvudkodfilen:
using System; using System.Text; using System.Net; using System.IO; using System.Collections.Generic;
Lägg till variabler för din prenumerationsnyckel, slutpunkt och sökväg till den bild som du vill ladda upp. För värdet
uriBase
kan du använda den globala slutpunkten i följande kod eller använda den anpassade underdomänslutpunkten som visas i Azure Portal för resursen.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>";
Skapa en metod med namnet
GetImageFileName()
för att hämta sökvägen till avbildningen.static string GetImageFileName(string path) { return new FileInfo(path).Name; }
Skapa en metod för att hämta binära data för avbildningen.
static byte[] GetImageBinary(string path) { return File.ReadAllBytes(path); }
Skapa formulärdata
Om du vill ladda upp en lokal avbildning skapar du först formulärdata som ska skickas till API:et. Formulärdata innehåller
Content-Disposition
huvudet, parameternname
inställd på "image" och parameternfilename
inställd på bildens filnamn. Innehållet i formuläret innehåller binära data i bilden. Den maximala bildstorleken som du kan ladda upp är 1 MB.--boundary_1234-abcd Content-Disposition: form-data; name="image"; filename="myimagefile.jpg" ÿØÿà JFIF ÖÆ68g-¤CWŸþ29ÌÄøÖ‘º«™æ±èuZiÀ)"óÓß°Î= ØJ9á+*G¦... --boundary_1234-abcd--
Lägg till gränssträngar för att formatera POST-formulärdata. Gränssträngar avgör start-, slut- och nyradstecken för data.
// 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}--";
Använd följande variabler för att lägga till parametrar i formulärdata:
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;
Skapa en funktion med namnet
BuildFormDataStart()
för att skapa början av formulärdata med hjälp av gränssträngarna och bildsökvägen.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; }
Skapa en funktion med namnet
BuildFormDataEnd()
för att skapa slutet av formulärdata med hjälp av gränssträngarna.static string BuildFormDataEnd(string boundary) { return CRLF + CRLF + string.Format(EndBoundaryTemplate, boundary) + CRLF; }
Anropa API för visuell sökning i Bing
Skapa en funktion för att anropa slutpunkten för visuell sökning i Bing och returnera JSON-svaret. Funktionen tar början och slutet av formulärdata, en bytematris som innehåller bilddata och ett
contentType
värde.Använd en
WebRequest
för att lagra URI, contentType-värde och rubriker.Använd
request.GetRequestStream()
för att skriva formulär- och bilddata och hämta sedan svaret. Funktionen bör likna följande kod: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; }
Skapa main-metoden
I metoden för
Main()
ditt program hämtar du filnamn och binära data för avbildningen.var filename = GetImageFileName(imagePath); var imageBinary = GetImageBinary(imagePath);
Konfigurera POST-brödtexten genom att formatera dess gräns. Anropa
BuildFormDataStart()
sedan ochBuildFormDataEnd()
skapa formulärdata.// Set up POST body. var boundary = string.Format(BoundaryTemplate, Guid.NewGuid()); var startFormData = BuildFormDataStart(boundary, filename); var endFormData = BuildFormDataEnd(boundary);
ContentType
Skapa värdet genom formateringCONTENT_TYPE_HEADER_PARAMS
och formulärdatagränsen.var contentTypeHdrValue = string.Format(CONTENT_TYPE_HEADER_PARAMS, boundary);
Hämta API-svaret genom att anropa
BingImageSearch()
och skriv sedan ut svaret.var json = BingImageSearch(startFormData, endFormData, imageBinary, contentTypeHdrValue); Console.WriteLine(json); Console.WriteLine("enter any key to continue"); Console.readKey();
Använda HttpClient
Om du använder HttpClient
kan du använda MultipartFormDataContent
klassen för att skapa formulärdata. Använd följande kodavsnitt för att ersätta motsvarande metoder i föregående exempel:
Ersätt metoden
Main()
med följande kod: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); } }
Ersätt metoden
BingImageSearch()
med följande kod:/// <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; }