Windows Presentation Foundation (WPF) 的保留模式图形系统给 Windows 图形编程带来了巨 大变化。程序不再需要在系統要求时重新在屏幕上创建自己的可视外观。这个复合系统会保留所有图形数 字,并将其安排到整个可视外观中。
保留模式图形确实能够简化工作流程,但是对于 Windows 编程人员来说,“简便”本身并 非是首要考虑目标。实际上,正是保留模式图形系统与通知机制(依赖关系属性)的组合,使 WPF 的灵 活性和功能得以展现。图形对象(如路径和画笔)看起来仍“存在”于复合系统中,并继续响 应属性更改和图形转换,因此允许对这些对象进行数据绑定和设置动画效果。
最近,我发现 WPF 位图具有类似的动态性质:呈现的位图仍会响应更改 — 不仅能够响应图形转换(众所周知),还 能响应位图中实际像素位的更改。
展现这种动态响应的两个位图类是 RenderTargetBitmap 和 WriteableBitmap,它们是由 BitmapSource 派生的 9 个类中的成员;BitmapSource 是一个抽象类,是 WPF 中的所有位图支持的基础。程序可以将其中某个位图对象与图像元素一起显示、使用 ImageBrush 类 将其制成一支平铺画笔,或者使用 ImageDrawing 类将其用作大型绘图(可能混有矢量图形)的一部分, 但无论以哪种方式使用,都不会在呈现位图后就将其忽略。相反,位图仍然位于可视复合系统中,并继续 响应应用程序更改。
使用 RenderTargetBitmap
RenderTargetBitmap 是一个位图,通过将 Visual 类型的对象传输到其表面即可进行有效绘制。要创建 RenderTargetBitmap 类型的新对象,唯一 的方法就是使用构造函数,并需要向该构造函数提供位图的像素尺寸、以每英寸点数表示的水平和垂直分 辨率,以及 PixelFormat 类型的对象。
稍后,我将详细介绍 PixelFormat 结构和相关的静态 PixelFormats 类。要创建 RenderTargetBitmap 类型的对象,您必须将 PixelFormats.Default 或 PixelFormats.Pbgra32 用作 RenderTargetBitmap 构造函数的最后一个参数。无论使用哪一个,都可以 创建一个 32 位/像素的透明位图。
最初,RenderTargetBitmap 对象是完全透明的。然后,您可 以使用 Visual 类型的对象(包括从 Visual 派生的类,如 FrameworkElement 和 Control)来调用 Render 方法,从而在此位图上进行绘制。通过调用 Clear,可还原完全透明的图像。如果当前显示的是 该位图,则上述调用将立即反映在显示的位图中。