Подтвердить что ты не робот

Разница между BitmapFrame и BitmapImage в WPF

В чем разница между BitmapFrame и BitmapImage в WPF? Где вы будете использовать каждый (то есть, почему вы используете BitmapFrame, а не BitmapImage?)

4b9b3361

Ответ 1

Вы должны придерживаться абстрактного класса BitmapSource, если вам нужно получить бит, или даже ImageSource, если вы просто хотите его нарисовать.

Реализация BitmapFrame - это только объектно-ориентированный характер реализации. У вас не должно быть никакой необходимости проводить различие между реализациями. BitmapFrames может содержать немного дополнительной информации (метаданные), но обычно ничего не нужно, кроме приложения для создания изображений.

Вы заметите эти другие классы, которые наследуют от BitmapSource:

  • BitmapFrame
  • BitmapImage
  • CachedBitmap
  • ColorConvertedBitmap
  • CroppedBitmap
  • FormatConvertedBitmap
  • RenderTargetBitmap
  • TransformedBitmap
  • WriteableBitmap

Вы можете получить BitmapSource из URI, создав объект BitmapImage:

Uri uri = ...;
BitmapSource bmp = new BitmapImage(uri);
Console.WriteLine("{0}x{1}", bmp.PixelWIdth, bmp.PixelHeight);

BitmapSource также может поступать из декодера. В этом случае вы косвенно используете BitmapFrames.

Uri uri = ...;
BitmapDecoder dec = BitmapDecoder.Create(uri, BitmapCreateOptions.None, BitmapCacheOption.Default);
BitmapSource bmp = dec.Frames[0];
Console.WriteLine("{0}x{1}", bmp.PixelWIdth, bmp.PixelHeight);

Ответ 2

BitmapFrame - примитив низкого уровня для манипуляции с изображениями. Он обычно используется, когда вы хотите кодировать/декодировать некоторое изображение из одного формата в другой.

BitmapImage - это абстракция более высокого уровня, которая имеет некоторые аккуратные свойства привязки данных (UriSource и т.д.).

Если вы просто показываете изображения и хотите какую-то точную настройку, то BitmapImage - это то, что вам нужно.

Если вы выполняете манипуляции с низким уровнем изображения, вам понадобится BitmapFrame.

Ответ 3

Я знаю, что это старый вопрос, но принятый ответ неполный (не предполагать, что мой ответ завершен), и мое дополнение может помочь кому-то где-то.

Причина (хотя и единственная причина) я использую BitmapFrame, когда я обращаюсь к отдельным кадрам изображения с несколькими кадрами TIFF, используя класс TiffBitmapDecoder. Например,

TiffBitmapDecoder decoder = new TiffBitmapDecoder(
    new Uri(filename), 
    BitmapCreateOptions.None, 
    BitmapCacheOption.None);

for (int frameIndex = 0; frameIndex < decoder.Frames.Count; frameIndex++)
{
    BitmapFrame frame = decoder.Frames[frameIndex];
    // Do something with the frame
    // (it inherits from BitmapSource, so the options are wide open)
}