我正在尝试找出一种方法,在img
标记中显示tiff图像(从Azure blob存储中提取)而不使用tiff查看器。我的第一个想法是将图像从tiff转换为png,然后在浏览器中将其显示为base64编码图像。
我已经看到Image.Save
方法被大量使用,但我似乎无法弄清楚如何在不将图像保存到磁盘的情况下使用它。
有没有办法可以将tiff转换为png,以便在浏览器中呈现?
公共ActionResult索引()
{
CloudBlobContainer blobContainer = GetContainer(documentsContainerName);
IEnumerable<string> blobs = blobContainer.ListBlobs().Select(blob =>
{
CloudBlockBlob blockBlob = (CloudBlockBlob)blob;
using (MemoryStream blockBlobStream = new MemoryStream())
{
blockBlob.DownloadToStream(blockBlobStream);
using (MemoryStream ms = new MemoryStream())
{
using (Image img = Image.FromStream(blockBlobStream))
{
img.Save(ms, ImageFormat.Png);
}
StreamReader reader = new StreamReader(ms);
byte[] bytedata = System.Text.Encoding.Default.GetBytes(reader.ReadToEnd());
string strBase64 = System.Convert.ToBase64String(bytedata);
return strBase64;
}
}
});
return View("Index", "", blobs);
}
答案 0 :(得分:3)
Per @ Dai的建议我能够使用Magick.Net nuget包将我的blob转换为png。
using (MemoryStream memStream = new MemoryStream())
{
using (MagickImage image = new MagickImage(byteArray))
{
image.Format = MagickFormat.Png;
image.Write(memStream);
}
return System.Convert.ToBase64String(memStream.ToArray());
}
答案 1 :(得分:1)
根据文档(https://msdn.microsoft.com/en-us/library/ms142147(v=vs.110).aspx),您可以创建内存流并将图像直接保存到它而不是磁盘。
编辑1:
猜测您正在使用某种API,您可以返回该img的字符串表示形式,让客户端JS将其保存在客户端计算机缓存中并将<img src=""/>
更改为正确的位置...
编辑2:
更好的方法是,在上传后,将tiff转换为png并将其存储在一起,然后仅将其作为常规blob引用到您的页面上...这样可以节省大量CPU功率,因为您不会转换tiff根据需要,但只有一次。