一、ITK的读写工作原理
在ITK里面,我们需要设置读取图像的像素类型,图像类型。
然后设置读取指针,将读取参数传入。
同时设置写指针,也将写入文件参数传入。
为了实现读写动作,我们需要构造一个IO工厂(IOFactory),用来实现读写的动作。
同时需要一个动作,用来触发上面设置的内容,使得一切开始工作。
这就好比是一台机器,我们并不知道机器内部是如何运行的(factory的工作机制),但是我们可以设置自己知道的参数,然后点击开始开关,
这个时候机器就能够正常运行,达到我们想要的效果。(这个其实也是API的含义所在)。
二、下面是对于读写机制的讲解
首先我们在右侧设置了ImageFileWriter 和ImageFileReader, 告诉函数我们需要操作的目标文件名。
然后factory创建ImageIO.
通过ImageIOFactory判断里面的哪一个工人可以对于这个文件进行读写操作。
比如说这个时候我们查找到了PNGImageIOFactory(确定的工人)可以对于目标文件进行读写操作,一个PNGImageIOFactory 就在内存中创建,作为ImageIOFactory的操作者,就把数据交给它来进行操作的,完成相应的读写操作。
工作就完成了。
这个机制就相当于供需平台一样:
一个人(wirter 或者 reader指针)把自己的需求,比如说修电器发布出来,然后有能力修电器的人接单(可以完成write或者read),然后登记(register),以公司名义(ImageIOFactory)完成相应的操作,结束工作。
一些ImageIO工厂如下:
三、例子
具体的工程构建方法参见博客一
代码如下:
#include "itkRGBPixel.h" #include "itkImage.h" #include "itkImageFileReader.h" #include "itkImageFileWriter.h" #include "itkJPEGImageIOFactory.h" int main(void) { //这里读取的时候是以RGBPixel的形式读取的,如果修改为如下,则是以灰度图读取的 //using PixelType =itk::RGBPixel<unsigned char>;
using PixelType=unsigned char; using ImageType=itk::Image<PixelType, 2>; using ReaderType =itk::ImageFileReader<ImageType>; using WriterType=itk::ImageFileWriter<ImageType>; ReaderType::Pointer reader = ReaderType::New(); WriterType::Pointer writer = WriterType::New(); //如果写入的话需要有这一句定义 itk::JPEGImageIOFactory::RegisterOneFactory(); reader->SetFileName("1.jpg"); writer->SetFileName("2.jpg"); writer->SetInput(reader->GetOutput()); try { writer->Update(); } catch (itk::ExceptionObject& err) { std::cerr << "ExceptionObject caught !" << std::endl; std::cerr << err << std::endl; return EXIT_FAILURE; } return EXIT_SUCCESS; }
四、注意
4.1相应的函数的使用要添加头文件
4.2更新动作触发的时候,最好是采用如下的代码:
try { writer->Update(); } catch (itk::ExceptionObject& err) { std::cerr << "ExceptionObject caught !" << std::endl; std::cerr << err << std::endl; return EXIT_FAILURE; }
3、读取文件位于工程目录,在运行程序以后,得到了两个.jpg文件
五、参考文档
InsightSoftwareGuide-Book2-5.0.1.pdf