Rövid útmutató: Képelemzések lekérése a Bing Visual Search REST API és a C használatával#
Figyelmeztetés
2020. október 30-án a Bing Search API-k átkerültek az Azure AI-szolgáltatásokból a Bing Search-szolgáltatásokba. Ez a dokumentáció csak referenciaként érhető el. A frissített dokumentációt a Bing search API dokumentációjában találja. Az új Azure-erőforrások Bing-kereséshez való létrehozásával kapcsolatos utasításokért lásd: Bing Search-erőforrás létrehozása a Azure Marketplace keresztül.
Ez a rövid útmutató bemutatja, hogyan tölthet fel képet a Bing Visual Search API-ba, és tekintheti meg a visszaadott megállapításokat.
Előfeltételek
- A Visual Studio 2019 bármely kiadása.
- A Json.NET keretrendszer NuGet-csomagként érhető el.
- Linux/MacOS használata esetén az alkalmazást a Mono használatával futtathatja.
Azure-erőforrás létrehozása
Kezdje el használni a Bing Visual Search API-t az alábbi Azure-erőforrások egyikének létrehozásával:
- A Azure Portal keresztül érhető el, amíg el nem törli az erőforrást.
- Válassza ki a tarifacsomagot
S9
.
- A Azure Portal keresztül érhető el, amíg el nem törli az erőforrást.
- Használja ugyanazt a kulcsot és végpontot az alkalmazásokhoz több Azure AI-szolgáltatásban.
Projekt létrehozása és inicializálása
A Visual Studióban hozzon létre egy BingSearchApisQuickStart nevű új konzolmegoldást. Adja hozzá a következő névtereket a fő kódfájlhoz:
using System; using System.Text; using System.Net; using System.IO; using System.Collections.Generic;
Adjon hozzá változókat az előfizetői azonosítóhoz, a végponthoz és az elérési úthoz a feltölteni kívánt rendszerképhez.
uriBase
Az értékhez használhatja a globális végpontot a következő kódban, vagy használhatja az erőforráshoz tartozó Azure Portal megjelenített egyéni altartományvégpontot.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>";
Hozzon létre egy nevű
GetImageFileName()
metódust a rendszerkép elérési útjának lekéréséhez.static string GetImageFileName(string path) { return new FileInfo(path).Name; }
Hozzon létre egy metódust a kép bináris adatainak lekéréséhez.
static byte[] GetImageBinary(string path) { return File.ReadAllBytes(path); }
Űrlapadatok létrehozása
Helyi rendszerkép feltöltéséhez először hozza létre az űrlapadatokat, és küldje el az API-nak. Az űrlapadatok tartalmazzák a
Content-Disposition
fejlécet, aname
paramétert "image" értékre, a paramétert pedig afilename
kép fájlnevére. Az űrlap tartalma tartalmazza a kép bináris adatait. A feltölthető képek maximális mérete 1 MB.--boundary_1234-abcd Content-Disposition: form-data; name="image"; filename="myimagefile.jpg" ÿØÿà JFIF ÖÆ68g-¤CWŸþ29ÌÄøÖ‘º«™æ±èuZiÀ)"óÓß°Î= ØJ9á+*G¦... --boundary_1234-abcd--
Adjon hozzá határsztringeket a POST űrlap adatainak formázásához. A határsztringek határozzák meg az adatok kezdő, záró és új vonal karaktereit.
// 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}--";
Az alábbi változókkal adhat hozzá paramétereket az űrlapadatokhoz:
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;
Hozzon létre egy nevű
BuildFormDataStart()
függvényt az űrlapadatok kezdővonalának létrehozásához a határsztringek és a kép elérési útja használatával.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; }
Hozzon létre egy nevű
BuildFormDataEnd()
függvényt az űrlapadatok végének létrehozásához a határsztringek használatával.static string BuildFormDataEnd(string boundary) { return CRLF + CRLF + string.Format(EndBoundaryTemplate, boundary) + CRLF; }
A Bing Visual Search API meghívása
Hozzon létre egy függvényt a Bing Visual Search-végpont meghívásához és a JSON-válasz visszaadásához. A függvény az űrlapadatok kezdetét és végét, a képadatokat tartalmazó bájttömböt és egy
contentType
értéket vesz fel.Az a
WebRequest
használatával tárolhatja az URI-t, a contentType értéket és a fejléceket.Segítségével
request.GetRequestStream()
megírhatja az űrlap- és képadatokat, majd lekérheti a választ. A függvénynek az alábbi kódhoz hasonlónak kell lennie: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; }
A Main metódus létrehozása
Main()
Az alkalmazás metódusában kérje le a kép fájlnevét és bináris adatait.var filename = GetImageFileName(imagePath); var imageBinary = GetImageBinary(imagePath);
Állítsa be a POST törzset a határ formázásával. Ezután hívja meg
BuildFormDataStart()
a ésBuildFormDataEnd()
a parancsot az űrlapadatok létrehozásához.// Set up POST body. var boundary = string.Format(BoundaryTemplate, Guid.NewGuid()); var startFormData = BuildFormDataStart(boundary, filename); var endFormData = BuildFormDataEnd(boundary);
Hozza létre az
ContentType
értéket formázássalCONTENT_TYPE_HEADER_PARAMS
és az űrlap adathatárával.var contentTypeHdrValue = string.Format(CONTENT_TYPE_HEADER_PARAMS, boundary);
Kérje le az API-választ a meghívásával
BingImageSearch()
, majd nyomtassa ki a választ.var json = BingImageSearch(startFormData, endFormData, imageBinary, contentTypeHdrValue); Console.WriteLine(json); Console.WriteLine("enter any key to continue"); Console.readKey();
HttpClient használata
Ha a parancsot használja HttpClient
, a MultipartFormDataContent
osztály használatával hozhatja létre az űrlapadatokat. Az előző példában szereplő megfelelő metódusok lecseréléséhez használja a kód alábbi szakaszait:
Cserélje le az
Main()
metódust az alábbi kódra: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); } }
Cserélje le az
BingImageSearch()
metódust az alábbi kódra:/// <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; }