2016-08-31 12 views
8

Kullanıcının bot aracılığıyla karşıya yüklediği bir kaynak görüntüden görüntüler oluşturmak için Bilişsel Hizmetler ile Microsoft Bot Framework kullanıyorum. C# kullanıyorum.Bir bağlantı yerine bir görüntü gönderin

Bilişsel Hizmetler API'si, işlenen görseli temsil eden byte[] veya Stream döndürür.

Bu resmi doğrudan kullanıcıma nasıl gönderebilirim? Tüm dokümanlar ve örnekler, resmi, resmi olarak adreslenebilir bir URL olarak barındırmak ve bir bağlantı göndermek zorunda olduğumu gösteriyor. Bunu yapabilirim ama yapmamayı tercih ederim.

Resim Caption Bot'un yaptığı gibi, görüntüyü nasıl kolayca döndüreceğini bilen var mı?

cevap

6

Böyle bir şey kullanmak gerekir: HTML resim öğelerinin

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

resim kaynak görüntüyü doğrudan ziyade görüntüyü indirmek için bir URL içeren bir veri URI olabilir. Aşağıdaki aşırı yüklenmiş işlevler geçerli herhangi bir resmi alır ve görüntüyü görüntülemek için doğrudan HTML öğelerinin src özelliğine sağlanabilen bir JPEG veri URI dizesi olarak kodlar. Görüntünün formatı zamanın geri döndüğünü biliyorsanız, temel görüntü olarak kodlanmış görüntüyü uygun görüntü verisi URI öneki ile döndürerek, görüntüyü JPEG olarak yeniden kodlamadan bazı işlemleri kaydedebilirsiniz.

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); 
    } 
} 
İlgili konular