ITK 中在输入/输出结构后面的原理叫做插拔式工厂。这个概念被解释在图 7-1 所示的UML 图表里。从用户的观点看,可靠的读、写文件的类是 itk::ImageFileReader 和itk::ImageFileWriter。这两个类不知道读或写特殊文件格式如 PNG 或 DICOM 的细节,它们所做的就是分派用户的要求给知道文件格式细节的类。这些类是 itk::ImageIO 类。ITK 授权机构使用户能够通过添加新类给 ImageIO 来扩展被支持的文件格式的数量。
ImageFileReader 和 ImageFileWriter 的每一个例子都有一个指向 ImageIO 对象的一个指针。如果指针是空的,读或写一个图像是不可能的,图像文件 reader/writer 必须决定由哪一个 ImageIO 类去执行 IO 操作。这个通过传递文件名给中央类、itk::ImageIOFactory 和确定读或写用户指定的文件的能力的 ImageIO 的子类来做。这个通过图 7-2 所示右边的例子进行介绍。
来源于 ImageIO
的每一个类必须提供一个达到
ImageIO
类要求的关联的工厂类。例如PNG 文件,有一个知道如何读文件的
itk::PNGImageIO 的对象和有一个能够构建PNGImageIO 对象并能返回指向它的一个指针的 itk::PNGImageIOFactory
类。每一次一个新的文件格式被添加时(
例如一个新的
ImageIO
子类被创建
)
,一个工厂类必须作为在图
7-3
所示介绍的 ImageIOFactory
类的一个父类被执行。
例如,为了读 PNG
文件,一个
PNGImageIOFactory
文件被创建并被图
7.2
中左边介绍的中央 ImageIOFactory
单独类配准。当
ImageFileReader
要求
ImageIOFactory
具有作为一个读文件的 ImageIO
能力,
ImageIOFactory
将会按照配准工厂的列表进行迭代,并询问它们是
否知道如何去读文件。可以作出肯定地响应的工厂将用于创建特殊的
ImageIO
案例,这个案例将会被返回到 ImageFileReader
并用于执行读操作。
在大多数情况下,机构对于仅仅与 ImageFileReader
和
ImageFileWriter
结合的用户来说是透明的。然而,明确地选择 ImageIO
的对象类型也是可能的。
![](https://i-blog.csdnimg.cn/blog_migrate/4c09c700eefdd54498e92ef51533ac9b.png)