在使用内存流作为TiffBitmap解码器的输入时需要帮助

时间:2018-06-23 23:19:55

标签: c# .net wpf image tiff

我正在用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;
        }
    }
}

谢谢您的任何建议。

1 个答案:

答案 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)