2016-08-31 4 views
8

Ich verwende das Microsoft Bot Framework mit Cognitive Services, um Bilder aus einem Quellbild zu generieren, das der Benutzer über den Bot hochlädt. Ich benutze C#. Die Cognitive Services API gibt byte[] oder Stream zurück, die das behandelte Bild darstellen.Ein Bild anstelle eines Links senden

Wie kann ich dieses Bild direkt an meinen Benutzer senden? Alle Dokumente und Beispiele scheinen darauf hinzuweisen, dass ich das Bild als öffentlich adressierbare URL hosten und einen Link senden muss. Ich kann das, aber ich möchte es lieber nicht.

Kann jemand das Bild einfach zurückgeben, wie der Untertitel-Bot?

Antwort

6

sollten Sie in der Lage sein, so etwas zu verwenden:

var message = activity.CreateReply(""); 
message.Type = "message"; 

message.Attachments = new List<Attachment>(); 
var webClient = new WebClient(); 
byte[] imageBytes = webClient.DownloadData("https://placeholdit.imgix.net/~text?txtsize=35&txt=image-data&w=120&h=120"); 
string url = "data:image/png;base64," + Convert.ToBase64String(imageBytes) 
message.Attachments.Add(new Attachment { ContentUrl = url, ContentType = "image/png" }); 
await _client.Conversations.ReplyToActivityAsync(message); 
3

Die Bildquelle von HTML-Bildelement kann ein Datum URI sein, die zum Herunterladen des Bildes des Bild direkt, anstatt eine URL enthält. Die folgenden überladenen Funktionen nehmen jedes gültige Bild und kodieren es als eine JPEG-Daten-URI-Zeichenkette, die direkt der src-Eigenschaft von HTML-Elementen zur Verfügung gestellt werden kann, um das Bild anzuzeigen. Wenn Sie das Format des zurückgegebenen Bilds im Voraus kennen, können Sie möglicherweise eine Verarbeitung speichern, indem Sie das Bild nicht als JPEG neu codieren, indem Sie einfach das Bild als Basis 64 mit dem entsprechenden Bilddaten-URI-Präfix zurückgeben.

public string ImageToBase64(System.IO.Stream stream) 
{ 
    // Create bitmap from stream 
    using (System.Drawing.Bitmap bitmap = System.Drawing.Bitmap.FromStream(stream) as System.Drawing.Bitmap) 
    { 
     // Save to memory stream as jpeg to set known format. Could also use PNG with changes to bitmap save 
     // and returned data prefix below 
     byte[] outputBytes = null; 
     using (System.IO.MemoryStream outputStream = new System.IO.MemoryStream()) 
     { 
      bitmap.Save(outputStream, System.Drawing.Imaging.ImageFormat.Jpeg); 
      outputBytes = outputStream.ToArray(); 
     } 

     // Encoded image byte array and prepend proper prefix for image data. Result can be used as HTML image source directly 
     string output = string.Format("data:image/jpeg;base64,{0}", Convert.ToBase64String(outputBytes)); 

     return output; 
    } 
} 

public string ImageToBase64(byte[] bytes) 
{ 
    using (System.IO.MemoryStream inputStream = new System.IO.MemoryStream()) 
    { 
     inputStream.Write(bytes, 0, bytes.Length); 
     return ImageToBase64(inputStream); 
    } 
}