PresentationCore.dll System.Windows.Media.Imaging BitmapSource.create() возвращает CachedBitmap

Этот код отлично работает с выводом файла с именем output2.tif, когда я передаю BitmapSource, прочитанный из файла.

FileInfo fi = new FileInfo(@"C:\Users\Chris\Downloads\PdfVerificationTests.can_use_image_approval_mode.approved.tiff");
 FileStream stream = fi.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
 TiffBitmapDecoder decoder = new TiffBitmapDecoder(stream, BitmapCreateOptions.None, BitmapCacheOption.None);
 EncodeImageFromBitmapSource(decoder.Frames[0]);
private void EncodeImageFromBitmapSource(BitmapSource theSource)
{
 //Taken from MSDN
 //http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.bitmapencoder(v=vs.110).aspx
 FileStream stream = new FileStream("output2.tif", FileMode.Create);
 TiffBitmapEncoder encoder = new TiffBitmapEncoder();
 TextBlock myTextBlock = new TextBlock();
 myTextBlock.Text = "Codec Author is: " + encoder.CodecInfo.Author.ToString();
 encoder.Frames.Add((BitmapFrame)theSource);
 encoder.Save(stream);
}

Этот код вызывает ошибку

private void EncodeImageFromArray(byte[] theSource)
{
 //Taken from Stack Overflow. Purported way to create a BitmapSource from a byte array
 //http://stackoverflow.com/questions/15274699/create-a-bitmapimage-from-a-byte-array/15290190?noredirect=1#comment36991252_15290190
 byte[] buffer = new byte[120000]; //changed from "..."
 Buffer.BlockCopy(theSource, 0, buffer, 0, 120000); //added to populate the array from the parameter
 var width = 400; // for example 100 changed to 400
 var height = 300; // for example 100 changed to 300 (400*300*1 = 120000)
 var dpiX = 96d;
 var dpiY = 96d;
 System.Windows.Media.PixelFormat pixelFormat = System.Windows.Media.PixelFormats.Gray8; // grayscale bitmap ambiguous PixelFormat reference changed
 var bytesPerPixel = (pixelFormat.BitsPerPixel + 7) / 8; // == 1 in this example
 var stride = bytesPerPixel * width; // == width in this example
 BitmapSource bitmap = BitmapSource.Create(width, height, dpiX, dpiY, pixelFormat, null, buffer, stride);
 //At this point, bitmap should be a BitmapSource??
 EncodeImageFromBitmapSource(bitmap);
}

Результатом второй функции является ошибка времени выполнения в строке encoder.Frames.Add EncodeImageFromBitmapSource:

System.InvalidCastException was unhandled
 HResult=-2147467262
 Message=Unable to cast object of type 'System.Windows.Media.Imaging.CachedBitmap' to type 'System.Windows.Media.Imaging.BitmapFrame'.

Итак, когда a BitmapSource не a BitmapSource? Когда он создается с помощью BitmapSource.create(), очевидно. Основной объект, созданный BitmapSource.create(), имеет тип CachedBitmap, а возврат передается в BitmapSource. Когда я использую BitmapSource в функции encoder.Frames.Add(), он выдает ошибку. Что мне не хватает?

Это еще один вопрос, но почему BitmapSource.create() возвращает что-то, что отличается от того, как оно используется между двумя примерами?

1 ответ

encoder.Frames.Add((BitmapFrame)theSource);

тип bitmapsource кажется не может просто преобразовать в тип bitmapFrame . (BitmapFrame) theSource, похоже, создаст исключение. Попробуйте

BitmapFrame.Create(theSource)

Ссылка: http://msdn.microsoft.com/en-us/library/ms615993 (v = vs .110).aspx

licensed under cc by-sa 3.0 with attribution.