2016-08-31 3 views
8

私は、ボットを介してユーザーがアップロードするソース画像から画像を生成するために、認知サービスを使用するMicrosoft Bot Frameworkを使用しています。私はC#を使用しています。リンクではなく画像を送信する

コグニティブサービスAPIは、処理された画像を表すbyte[]またはStreamを返します。

どうすればその画像を自分のユーザーに直接送信できますか?すべてのドキュメントとサンプルは、画像を公開URLとしてホストしてリンクを送信しなければならないことを指摘しているようです。私はこれをすることができますが、私はむしろそうしません。

キャプションボットのように画像を簡単に返す方法を知っている人はいますか?

答えて

6

あなたはこのようなものを使用することができるはずです:HTML画像要素の

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

画像ソースは画像ではなく、直接画像をダウンロードするためのURLが含まれているデータURIすることができます。次のオーバーロードされた関数は、有効な任意のイメージを取得し、イメージを表示するためにHTML要素のsrcプロパティに直接提供されるJPEGデータURI文字列としてエンコードします。イメージの形式が返される前に知っていれば、適切なイメージデータURI接頭辞を付けてベース64としてエンコードされたイメージを返すだけで、イメージをJPEGとして再エンコードしないで保存することができます。

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); 
    } 
} 
関連する問題