一、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, >; 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

二、ITK例子-jpg图像读写的更多相关文章

  1. 三、ITK的dcm图像读写

    一.主要功能 1.读取单张dcm图像 2.写入单张dcm图像 3.图像调整之后以.jpg格式写入 4.调整之后重新以.dcm格式写入 二.代码 #include "itkImageFileR ...

  2. [python-opencv]图像二值化【图像阈值】

    图像二值化[图像阈值]简介: 如果灰度图像的像素值大于阈值,则为其分配一个值(可以是白色255),否则为其分配另一个值(可以是黑色0) 图像二值化就是将灰度图像上的像素值设置为0或255,也就是将整个 ...

  3. 旋转图像 给定一个 n × n 的二维矩阵表示一个图像。

    给定一个 n × n 的二维矩阵表示一个图像. 将图像顺时针旋转 90 度. 说明: 你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵.请不要使用另一个矩阵来旋转图像. 示例 : 给定 ma ...

  4. 十二、ITK例程-医疗图像配准的HelloWorld程序

    一.说明 医疗图像配准是ITK的一个重要内容,而我们今天想要说的一个程序则相当于是其中的HelloWorld程序. 程序源码位置: InsightToolkit-\Examples\Registrat ...

  5. C# Emgu CV学习笔记二之图像读写的两种方法

    http://blog.csdn.net/marvinhong/article/details/6800450 图像显示在控件loadPictureBox上 方法一 //读取图像001.jpg Int ...

  6. Java开发笔记(一百二十三)AWT图像视图

    前面介绍了AWT的几种基础控件,从按钮到文本标签,从输入框到选择框,无一例外都能显示文字,唯独无法显示某张图片文件.本以为AWT会提供专门的控件来显示图片,然而偏偏没有意料之中的图像控件,这可真是弱爆 ...

  7. CRM 2013 系统设置新功能二:Entity images 图像字段

    CRM2013系统默认的许多实体都已经有了图像的选择,如 右上角可以设置当前用户的头像. 客户.联系人等都可以,下面将介绍一下此项新功能: 一.实体中新建图像字段,其中系统自动命名entityinag ...

  8. opencv 批量图像读写

    处理图像数据集时通常要读写整个文件夹里的图像,这时就会用的图像的批量读写. 比较常用的方法就是生成一个包含所有图像的txt列表 生成txt文件的方法如下: 利用cmd进入dos 利用路径进入指定文件夹 ...

  9. 从零开发分布式数据库中间件 二、构建MyBatis的读写分离数据库中间件

    在上一节 从零开发分布式数据库中间件 一.读写分离的数据库中间件 中,我们讲了如何通过ThreadLocal来指定每次访问的数据源,并通过jdbc的连接方式来切换数据源,那么这一节我们使用我们常用的数 ...

随机推荐

  1. Ant Design 错误记录

    Ant Design 错误记录 一: 标签页Tabs 1:设置activeKey或defaultActiveKey,绑定默认值不起作用: =>    需要同时设置activeKey和defaul ...

  2. 教你用python假装黑客装逼,当着朋友的面破解他的网站密码!

    如何破解iphone登陆密码 今天看了一篇关于如何破解iphone手机密码的文章,瞬间觉得科学技术不是第一生产力,why? 根据“可靠消息”称,即便美国FBI也无法轻易的对iphone手机进行暴力破解 ...

  3. java核心API

    ---恢复内容开始--- Javase01 day01 关于String: String是不可变对象,java.lang.String使用了final修饰,不能被继承: 字符串一旦创建永远无法改变,但 ...

  4. leaflet 结合 Echarts4 实现统计图(附源码下载)

    前言 leaflet 入门开发系列环境知识点了解: leaflet api文档介绍,详细介绍 leaflet 每个类的函数以及属性等等 leaflet 在线例子 leaflet 插件,leaflet ...

  5. 46.QT-自带库QSerialPort串口使用

    之前一章学习的是第三方库使用: 34.QT-qextserialport第三方库制作串口助手(并动态检测在线串口,附带源码) 本章来学习自带serial库 1.QSerialPortInfo QLis ...

  6. 搭建Vue开发环境

    1.安装Node.js 安装包下载地址: https://nodejs.org/en/ 安装时可以选择是否自动安装必要的工具,如Chocolatey.Python2,这里我选择了自动安装 Node.j ...

  7. Tornado—三种启动tornado的方式

    第一种启动方式:单进程 import tornado.web # web服务 import tornado.ioloop # I/O 时间循环 class Mainhandler(tornado.we ...

  8. css字体效果

    text-shadow还没有出现时,大家在网页设计中阴影一般都是用photoshop做成图片,现在有了css3可以直接使用text-shadow属性来指定阴影.这个属性可以有两个作用,产生阴影和模糊主 ...

  9. Gluserfs 架构详解【译】官网

    Gluserfs详解 排版看着不舒服的,可以查看[我的简书](https://www.jianshu.com/p/0340e429431b) doc home:https://docs.gluster ...

  10. SpringBoot2.0 整合 ElasticSearch框架,实现高性能搜索引擎

    本文源码:GitHub·点这里 || GitEE·点这里 一.安装和简介 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful ...