c# - 如何在 Silverlight Image 控件上显示 TIFF(以 Byte[] 的形式)

标签 c# .net silverlight-4.0 tiff libtiff.net

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

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

所以我在绑定(bind) XAML 期间使用转换器,以便将 Byte[] 转换为 Bitmap 因为 Image.Source 只接受它们中的一个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;

但是,我在 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;
}
  • 另一个解决方案是使用 LibTiff.Net在 Silverlight 上直接将 TIFF 的 Byte[] 直接转换为 WritableBitmap 的库。

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

谁能帮我如何在 Silverlight 的图像控件上显示 TIFF 文件?

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

谢谢

最佳答案

我认为 LibTiff 将是必经之路。最终 Tiff.ClientData 接受作为 tiff 数据的 Stream。如果您的 tiff 数据确实是一个 byte[],那么您只需要一个 MemoryStream 围绕它。更有可能在某个时候 byte[] 是从流中提取的,因此您可能甚至不需要这个中介 byte[]/MemoryStream .

关于c# - 如何在 Silverlight Image 控件上显示 TIFF(以 Byte[] 的形式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6065824/

相关文章:

windows-phone-7 - Listbox SelectionChanged 在函数内设置为 -1 时触发,wp7

c# - AutoMapper 3 中的映射行为不一致

c# - MVC 4 如何显示注解

c# - C# .NET 中 FileStream 的替代方案

c# - 为什么我需要在程序逻辑中枚举我的列表才能在这种情况下工作?

Silverlight MVVM 绑定(bind)更新以不希望的顺序触发

c# - 银光 : How to do data entry to a collection?

c# - 如何将 ListView 绑定(bind)到多个实体?

c# - 这是在 asp.net 页面之间传递变量的好方法吗

c# - 需要一个高效的内存缓存,每秒可以处理 4k 到 7k 的查找或写入