我创建了一个窗口服务来将我所有的 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/