2016-08-31 19 views
8

Tôi đang sử dụng Microsoft Bot Framework với Dịch vụ nhận thức để tạo hình ảnh từ hình ảnh nguồn mà người dùng tải lên qua bot. Tôi đang sử dụng C#.Gửi hình ảnh thay vì liên kết

API dịch vụ nhận thức trả lại byte[] hoặc Stream đại diện cho hình ảnh được xử lý.

Tôi làm cách nào để gửi hình ảnh đó trực tiếp đến người dùng của mình? Tất cả tài liệu và mẫu dường như trỏ đến tôi phải lưu trữ hình ảnh dưới dạng URL địa chỉ công khai và gửi liên kết. Tôi có thể làm điều này nhưng tôi không muốn.

Có ai biết cách trả lại hình ảnh đơn giản, giống như chú thích Bot không?

Trả lời

6

Bạn sẽ có thể sử dụng một cái gì đó như thế này: nguồn

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

Những hình ảnh của các yếu tố hình ảnh HTML có thể là một URI dữ liệu có chứa các hình ảnh trực tiếp chứ không phải là một URL để tải về hình ảnh. Các hàm quá tải sau sẽ lấy bất kỳ hình ảnh hợp lệ nào và mã hóa nó dưới dạng chuỗi dữ liệu JPEG URI có thể được cung cấp trực tiếp đến thuộc tính src của các phần tử HTML để hiển thị hình ảnh. Nếu bạn biết trước định dạng của hình ảnh được trả lại, thì bạn có thể lưu một số xử lý bằng cách không mã hóa lại hình ảnh dưới dạng JPEG bằng cách chỉ trả lại hình ảnh được mã hóa dưới dạng cơ sở 64 với tiền tố URI dữ liệu hình ảnh thích hợp.

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); 
    } 
} 
Các vấn đề liên quan