0

Ich versuche eine einfache Azure-Funktion zu erstellen, die auf der ImageResizer example basiert, verwendet aber die Microsoft Cognitive Server Computer Vision API, um die Größenänderung vorzunehmen.Mein Azure Storage-Ausgabeblob wird nie angezeigt.

Ich habe working code for the Computer Vision API, die ich in die Azure-Funktion portiert habe.

Es scheint alles ok zu funktionieren (keine Fehler), aber mein Ausgabeblob wird nie gespeichert oder erscheint im Speichercontainer. Ich bin mir nicht sicher, was ich falsch mache, da es keine Fehler gibt, mit denen ich arbeiten kann.

Mein CSX (C# Funktionscode) ist als

using System; 
using System.Text; 
using System.Net.Http; 
using System.Net.Http.Headers; 

public static void Run(Stream original, Stream thumb, TraceWriter log) 
{ 
    //log.Verbose($"C# Blob trigger function processed: {myBlob}. Dimensions"); 
    string _apiKey = "PutYourComputerVisionApiKeyHere"; 
    string _apiUrlBase = "https://api.projectoxford.ai/vision/v1.0/generateThumbnail"; 
    string width = "100"; 
    string height = "100"; 
    bool smartcropping = true; 

    using (var httpClient = new HttpClient()) 
    { 
     //setup HttpClient 
     httpClient.BaseAddress = new Uri(_apiUrlBase); 
     httpClient.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", _apiKey); 

     //setup data object 
     HttpContent content = new StreamContent(original); 
     content.Headers.ContentType = new MediaTypeWithQualityHeaderValue("application/octet-stream"); 

     // Request parameters 
     var uri = $"{_apiUrlBase}?width={width}&height={height}&smartCropping={smartcropping}"; 

     //make request 
     var response = httpClient.PostAsync(uri, content).Result; 

     //log result 
     log.Verbose($"Response: IsSucess={response.IsSuccessStatusCode}, Status={response.ReasonPhrase}"); 

     //read response and write to output stream 
     thumb = new MemoryStream(response.Content.ReadAsByteArrayAsync().Result); 
    } 
} 

Meine Funktion json folgt als

{ 
    "bindings": [ 
    { 
     "path": "originals/{name}", 
     "connection": "thumbnailgenstorage_STORAGE", 
     "name": "original", 
     "type": "blobTrigger", 
     "direction": "in" 
    }, 
    { 
     "path": "thumbs/%rand-guid%", 
     "connection": "thumbnailgenstorage_STORAGE", 
     "type": "blob", 
     "name": "thumb", 
     "direction": "out" 
    } 
    ], 
    "disabled": false 
} 

Mein Azure-Speicher-Konto genannt wird 'thumbnailgenstorage' folgt und es hat zwei Container genannt 'originals' und 'thumbs'. Der Speicherkontoschlüssel lautet KGdcO+hjvARQvSwd2rfmdc+rrAsK0tA5xpE4RVNmXZgExCE+Cyk4q0nSiulDwvRHrSAkYjyjVezwdaeLCIb53g==.

Ich bin vollkommen glücklich, dass Leute meine Schlüssel benutzen, um mir zu helfen, das herauszufinden! :)

+0

Ich glaube, ich habe dieses Problem behoben. Ich bin mir nicht sicher, ob ich richtig in den Ausgabe-Blob geschrieben habe. Dies scheint zu funktionieren: '// Antwort lesen und in Ausgabestrom schreiben var responseBytes = response.Content.ReadAsByteArrayAsync(). Result; thumb.Write (responseBytes, 0, responseBytes.Length); '. Außerdem ist mein Ausgabepfad in meinem JSON jetzt "thumbs /% rand-guid% .jpg", ". Ich werde ein bisschen mehr recherchieren und eine vollständige Antwort posten, wenn ich sicher bin, dass es funktioniert. –

+0

Ja, das ist richtig - eine einfache Zuordnung zum Stream ist nicht das Modell, da es kein 'out'-Parameter im Sprachsinn ist. Sie müssen in den bereitgestellten Stream schreiben. Sie werden feststellen, dass dies bei allen anderen Bindungen der Fall ist. – mathewc

Antwort

2

Ich habe das jetzt funktioniert. Ich habe den Ausgabestream falsch geschrieben.

Diese Lösung ist eine Azure-Funktion, die bei der Ankunft eines Blobs in einem Azure Blob Storage-Container mit dem Namen 'Originals' ausgelöst wird. Anschließend wird das Bild mithilfe der Computer Vision API Größe in einem anderen Blob-Container namens 'Thumbs' gespeichert. .

Hier ist die Arbeits CSX (C# Skript):

using System; 
using System.Text; 
using System.Net.Http; 
using System.Net.Http.Headers; 

public static void Run(Stream original, Stream thumb, TraceWriter log) 
{ 
    int width = 320; 
    int height = 320; 
    bool smartCropping = true; 
    string _apiKey = "PutYourComputerVisionApiKeyHere"; 
    string _apiUrlBase = "https://api.projectoxford.ai/vision/v1.0/generateThumbnail"; 

    using (var httpClient = new HttpClient()) 
    { 
     httpClient.BaseAddress = new Uri(_apiUrlBase); 
     httpClient.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", _apiKey); 
     using (HttpContent content = new StreamContent(original)) 
     { 
      //get response 
      content.Headers.ContentType = new MediaTypeWithQualityHeaderValue("application/octet-stream"); 
      var uri = $"{_apiUrlBase}?width={width}&height={height}&smartCropping={smartCropping.ToString()}"; 
      var response = httpClient.PostAsync(uri, content).Result; 
      var responseBytes = response.Content.ReadAsByteArrayAsync().Result; 

      //write to output thumb 
      thumb.Write(responseBytes, 0, responseBytes.Length); 
     } 
    } 
} 

Hier ist die JSON-Integration ist

{ 
    "bindings": [ 
    { 
     "path": "originals/{name}", 
     "connection": "thumbnailgenstorage_STORAGE", 
     "name": "original", 
     "type": "blobTrigger", 
     "direction": "in" 
    }, 
    { 
     "path": "thumbs/{name}", 
     "connection": "thumbnailgenstorage_STORAGE", 
     "name": "thumb", 
     "type": "blob", 
     "direction": "out" 
    } 
    ], 
    "disabled": false 
}