我正在用C#和WPF编写图像查看器,用于存储在SQL Server数据库 image 列中的TIFF图像。我已经使用GetBytes循环将图像的检索编码到内存流中,并且可以正常工作。无法正常工作的是从内存流中创建一个TiffBitmapDecoder,并将其用作WPF / XAML图像控件的BitmapSource。这是我的函数,返回以内存流作为输入的BitmapSource:
namespace ViewDBImages
{
public static class Utility
{
public static BitmapSource StreamToImage(MemoryStream imageMem)
{
//
// Decode the Memory Stream argument into a Bitmap with TIFF format
// First we have to set the Stream seek location to the origin
//
imageMem.Seek(0, SeekOrigin.Begin);
//
// Decode the stream into a TiffBitmap and return it as the image source
//
TiffBitmapDecoder decoder = new TiffBitmapDecoder(imageMem, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnDemand);
BitmapSource source = decoder.Frames[0];
return source;
}
}
}
我相信图像已被设置为图像控件的来源,因为我可以看到滚动条在检索时发生了变化,但它们不可见。我还看到此函数完成后,内存流的位置为“ 8”,但是流的大小为63,083字节。
为帮助调试此问题,我将内存流复制到TIFF文件,并将其用作解码器的流输入。图像以这种方式正确显示。因此,我怀疑将图像存储为文件时必须有某种控制信息,但是在内存流中找不到该信息。这是代码:
namespace ViewDBImages
{
public static class Utility
{
public static BitmapSource StreamToImage(MemoryStream imageMem)
{
//
// Copy the Memory Stream argument into a filestream and save as a TIF file
// First we have to set the Stream seek location to the origin
//
imageMem.Seek(0, SeekOrigin.Begin);
FileStream imageFile = new FileStream(@"C:\Image Test\Testfile.tif", FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);
imageMem.CopyTo(imageFile);
//
// Decode the file to a TiffBitmap and return it as the image source
//
TiffBitmapDecoder decoder = new TiffBitmapDecoder(imageFile, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnDemand);
BitmapSource source = decoder.Frames[0];
return source;
}
}
}
谢谢您的任何建议。
答案 0 :(得分:0)
尝试设置BitmapCacheOption.OnLoad
以使解码器立即加载位图:
var decoder = new TiffBitmapDecoder(
imageMem, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
return source = decoder.Frames[0];
请注意,您还可以直接从流中创建BitmapFrame。自动选择适当的解码器。
return BitmapFrame.Create(
imageMem, BitmapCreateOptions.None, BitmapCacheOption.OnLoad)