发送图像而不是 link
Send an image rather than a link
我使用带有认知服务的 Microsoft Bot Framework 从用户通过机器人上传的源图像生成图像。我正在使用 C#。
认知服务 API return 是一个 byte[]
或 Stream
代表处理过的图像。
如何将该图像直接发送给我的用户?所有文档和示例似乎都指向我必须将图像托管为可公开寻址 URL 并发送 link。我可以做到,但我宁愿不这样做。
有谁知道如何简化 return 图像,就像 Caption Bot 那样?
你应该可以使用这样的东西:
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);
HTML个图片元素的图片来源可以是直接包含图片的数据URI,而不是URL下载图片。以下重载函数将获取任何有效图像并将其编码为 JPEG 数据 URI 字符串,该字符串可直接提供给 HTML 元素的 src 属性 以显示图像。如果您提前知道返回图像的格式,那么您可以通过不将图像重新编码为 JPEG 来节省一些处理,只需返回编码为带有适当图像数据 URI 前缀的 base 64 的图像。
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);
}
}
我使用带有认知服务的 Microsoft Bot Framework 从用户通过机器人上传的源图像生成图像。我正在使用 C#。
认知服务 API return 是一个 byte[]
或 Stream
代表处理过的图像。
如何将该图像直接发送给我的用户?所有文档和示例似乎都指向我必须将图像托管为可公开寻址 URL 并发送 link。我可以做到,但我宁愿不这样做。
有谁知道如何简化 return 图像,就像 Caption Bot 那样?
你应该可以使用这样的东西:
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);
HTML个图片元素的图片来源可以是直接包含图片的数据URI,而不是URL下载图片。以下重载函数将获取任何有效图像并将其编码为 JPEG 数据 URI 字符串,该字符串可直接提供给 HTML 元素的 src 属性 以显示图像。如果您提前知道返回图像的格式,那么您可以通过不将图像重新编码为 JPEG 来节省一些处理,只需返回编码为带有适当图像数据 URI 前缀的 base 64 的图像。
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);
}
}