Hızlı Başlangıç: Bing Görsel Arama REST API'sini ve C'yi kullanarak görüntü içgörüleri alma#

Uyarı

30 Ekim 2020'de Bing Arama API'leri Azure yapay zeka hizmetlerinden Bing Arama Hizmetlerine taşındı. Bu belgeler yalnızca başvuru için sağlanır. Güncelleştirilmiş belgeler için Bing arama API'sinin belgelerine bakın. Bing araması için yeni Azure kaynakları oluşturma yönergeleri için bkz. Azure Market aracılığıyla Bing Arama kaynağı oluşturma.

Bu hızlı başlangıçta, Bing Görsel Arama API'sine nasıl görüntü yüklendiği ve döndürdüğü içgörülerin nasıl görüntülendiği gösterilmektedir.

Önkoşullar

Azure kaynağı oluşturma

Aşağıdaki Azure kaynaklarından birini oluşturarak Bing Görsel Arama API'sini kullanmaya başlayın:

v7 kaynağını Bing Arama

  • Kaynağı silene kadar Azure portal aracılığıyla kullanılabilir.
  • Fiyatlandırma katmanını S9 seçin.

Çok hizmetli kaynak

  • Kaynağı silene kadar Azure portal aracılığıyla kullanılabilir.
  • Birden çok Azure AI hizmeti genelinde uygulamalarınız için aynı anahtarı ve uç noktayı kullanın.

Proje oluşturma ve başlatma

  1. Visual Studio'da BingSearchApisQuickStart adlı yeni bir konsol çözümü oluşturun. Aşağıdaki ad alanlarını ana kod dosyasına ekleyin:

    using System;
    using System.Text;
    using System.Net;
    using System.IO;
    using System.Collections.Generic;
    
  2. Karşıya yüklemek istediğiniz görüntüye abonelik anahtarınız, uç noktanız ve yolunuz için değişkenler ekleyin. Değeri için uriBase aşağıdaki kodda genel uç noktayı kullanabilir veya kaynağınızın Azure portal görüntülenen özel alt etki alanı uç noktasını kullanabilirsiniz.

        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. Görüntünüzün yolunu almak için adlı GetImageFileName() bir yöntem oluşturun.

    static string GetImageFileName(string path)
            {
                return new FileInfo(path).Name;
            }
    
  4. Görüntünün ikili verilerini almak için bir yöntem oluşturun.

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

Form verilerini oluşturma

  1. Yerel bir görüntüyü karşıya yüklemek için önce API'ye gönderilecek form verilerini oluşturun. Form verileri üst bilgiyi, name "image" olarak ayarlanmış parametreyi filename ve görüntünün dosya adına ayarlanmış parametreyi içerirContent-Disposition. Formun içeriği görüntünün ikili verilerini içerir. Karşıya yükleyebileceğiniz görüntü boyutu üst sınırı 1 MB'tır.

    --boundary_1234-abcd
    Content-Disposition: form-data; name="image"; filename="myimagefile.jpg"
    
    ÿØÿà JFIF ÖÆ68g-¤CWŸþ29ÌÄøÖ‘º«™æ±èuZiÀ)"óÓß°Î= ØJ9á+*G¦...
    
    --boundary_1234-abcd--
    
  2. POST form verilerini biçimlendirmek için sınır dizeleri ekleyin. Sınır dizeleri verilerin başlangıç, bitiş ve yeni satır karakterlerini belirler.

    // 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. Form verilerine parametre eklemek için aşağıdaki değişkenleri kullanın:

    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. Sınır dizelerini ve görüntü yolunu kullanarak form verilerinin başlangıcını oluşturmak için adlı BuildFormDataStart() bir işlev oluşturun.

        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. Sınır dizelerini kullanarak form verilerinin sonunu oluşturmak için adlı BuildFormDataEnd() bir işlev oluşturun.

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

Bing Görsel Arama API'sini çağırma

  1. Bing Görsel Arama uç noktasını çağırmak ve JSON yanıtını döndürmek için bir işlev oluşturun. işlevi form verilerinin başlangıcını ve sonunu, görüntü verilerini içeren bir bayt dizisini ve bir contentType değeri alır.

  2. URI'nizi, contentType değerinizi ve üst bilgilerinizi depolamak için bir WebRequest kullanın.

  3. Form ve görüntü verilerinizi yazmak ve ardından yanıtı almak için kullanın request.GetRequestStream() . İşleviniz aşağıdaki koda benzer olmalıdır:

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

Main yöntemini oluşturma

  1. Uygulamanızın yönteminde Main() görüntünüzün dosya adını ve ikili verilerini alın.

    var filename = GetImageFileName(imagePath);
    var imageBinary = GetImageBinary(imagePath);
    
  2. Post gövdesini, sınırını biçimlendirerek ayarlayın. Ardından ve öğesini çağırarak BuildFormDataStart()BuildFormDataEnd() form verilerini oluşturun.

    // Set up POST body.
    var boundary = string.Format(BoundaryTemplate, Guid.NewGuid());
    var startFormData = BuildFormDataStart(boundary, filename);
    var endFormData = BuildFormDataEnd(boundary);
    
  3. Biçimlendirmeye ContentTypeCONTENT_TYPE_HEADER_PARAMS ve form veri sınırına göre değeri oluşturun.

    var contentTypeHdrValue = string.Format(CONTENT_TYPE_HEADER_PARAMS, boundary);
    
  4. çağırarak BingImageSearch()API yanıtını alın ve ardından yanıtı yazdırın.

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

HttpClient kullanma

kullanıyorsanız HttpClient, form verilerini oluşturmak için sınıfını kullanabilirsiniz MultipartFormDataContent . Önceki örnekte karşılık gelen yöntemleri değiştirmek için aşağıdaki kod bölümlerini kullanın:

  1. Main() yöntemini aşağıdaki kod ile değiştirin:

            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. BingImageSearch() yöntemini aşağıdaki kod ile değiştirin:

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

Sonraki adımlar