Azure Blob TIFF到PNG转换,无需下载

时间:2017-05-03 18:33:25

标签: c# asp.net-mvc azure

我正在尝试找出一种方法,在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);
}

2 个答案:

答案 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根据需要,但只有一次。