WPF中BitmapFrame和BitmapImage的区别

15

在WPF中,BitmapFrame和BitmapImage有什么区别?何时使用它们(即为什么会使用BitmapFrame而不是BitmapImage)?

3个回答

13
如果您需要获取位图,建议使用抽象类BitmapSource,甚至只需绘制它,也可以使用ImageSource。实现的BitmapFrame只是面向对象实现的体现。您不应该有任何区分实现的需要。BitmapFrames可能包含一些额外的信息(元数据),但通常只有成像应用程序会关心。
您会注意到这些从BitmapSource继承的其他类:
  • BitmapFrame
  • BitmapImage
  • CachedBitmap
  • ColorConvertedBitmap
  • CroppedBitmap
  • FormatConvertedBitmap
  • RenderTargetBitmap
  • TransformedBitmap
  • WriteableBitmap
您可以通过构造一个BitmapImage对象从URI获取BitmapSource:
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);

你如何使用ImageSource?你如何通过Uri加载BitmapSource? - Kris Erickson

4

被接受的答案不完整(这并不意味着我的答案是完整的),我的补充可能会在某处帮助到某个人。

我使用BitmapFrame的原因(尽管是唯一的原因)是当我使用TiffBitmapDecoder类访问多帧TIFF图像的各个帧时。例如,

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)
}

2

BitmapFrame是用于图像处理的低级原语。通常在您想要将某些图像从一种格式编码/解码为另一种格式时使用。

BitmapImage是更高级的抽象,具有一些不错的数据绑定属性(UriSource等)。

如果您只是显示图像并希望进行一些微调,则需要使用BitmapImage。

如果您正在进行低级别的图像处理,则需要使用BitmapFrame。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接