Я пишу средство просмотра изображений на C # и в WPF для изображений TIFF, хранящихся в базе данных SQL Server image столбец.Я закодировал получение изображений в поток памяти, используя цикл GetBytes, и это работает.Что не работает, так это создание TiffBitmapDecoder из потока памяти и использование его в качестве BitmapSource для элемента управления изображения WPF / XAML.Вот моя функция вернуть 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;
}
}
}
Спасибо за любой совет.