如何在Silverlight图像控件上显示TIFF(以字节[]的形式)

Tai*_*Tai 5 .net c# tiff silverlight-4.0 libtiff.net

我创建了一个窗口服务,将所有TIFF文件放入数据库并存储为Byte[].

现在我希望能够通过Silverlight Image控件显示它们

所以我在绑定XAML时使用Converter以转换Byte[]Bitmap因为Image.Source唯一接受eitheir URI(我没有将文件存储在服务器上所以不能使用此方法)或Bitmap.

BitmapImage bmi = new BitmapImage();
if (value != null)
{
    ImageGallery imageGallery = value as ImageGallery;
    byte[] imageContent = imageGallery.ImageContent;
    string imageType = imageGallery.ImageType;
    using (MemoryStream ms = new MemoryStream(imageContent))
    {
        bmi.SetSource(ms);
    }
}
return bmi;
Run Code Online (Sandbox Code Playgroud)

但是,我得到了例外,bmi.SetSource(ms)因为Silverlight仅支持JPEG和PNG图像.

所以我做了更多的研究,并知道我应该将TIFF的字节转换为JPEG或PNG的字节然后它将工作.

为此,我尝试了两种方法:

  • 在服务器上进行转换:在我的RIA服务调用中,在检索之后ImageGallery,我遍历可用图像以将TIFF的字节转换为JPEG的字节.

但它不工作....你能告诉我我做错了吗?

public IQueryable<ImageGallery> GetImageGalleries()
{
    var imageGalleries = this.ObjectContext.ImageGalleries.OrderBy(i=>i.ImageName);
    foreach (ImageGallery imageGallery in imageGalleries)
    {
        if (imageGallery.ImageType == ".tif" || imageGallery.ImageType == ".tiff")
        {
            //Convert the Tiff byte array format into JPEG stream format
            System.Drawing.Bitmap dImg = new System.Drawing.Bitmap(new MemoryStream(imageGallery.ImageContent));
            MemoryStream ms = new MemoryStream();
            dImg.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);

            //then convert the JPEG stream format into JPEG byte array format
            byte[] buf = new byte[ms.Length];  
            ms.Read(buf, 0, buf.Length);

            //Changing the format tiff byte[] of ImageGallery to jpeg byte[] 
            imageGallery.ImageContent = buf;
        }
    }
    return imageGalleries;
}
Run Code Online (Sandbox Code Playgroud)
  • 另一个解决方案是使用LibTiff.Net库将Byte[]TIFF WritableBitmap直接转换为直接在Silverlight上.

但是,在通过他们的示例应用程序或使用Reflector查看源代码函数之后,我仍然无法弄清楚如何使用他们的库将TIFF的字节转换为WritableBitmapJPEG(或PNG),因为他们的示例仅显示了API使用搜索文件目录中的TIFF.就我而言,我在服务器上没有现有文件.

有人可以帮我如何在Silverlight的Image控件上显示TIFF文件吗?

我搜索了论坛,但没有找到任何可靠的答案.

谢谢

Ant*_*nes 2

我认为 LibTiff 将是最佳选择。最终Tiff.ClientData接受Streamtiff 数据。如果你的 tiff 数据确实是 abyte[]那么你只需要MemoryStream围绕它。更有可能的是,在某个时刻,它byte[]是从流中提取的,因此您可能甚至不需要这个中间byte[]/ MemoryStream