DGtal  1.5.beta
VolWriter.ih
1 /**
2  * This program is free software: you can redistribute it and/or modify
3  * it under the terms of the GNU Lesser General Public License as
4  * published by the Free Software Foundation, either version 3 of the
5  * License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program. If not, see <http://www.gnu.org/licenses/>.
14  *
15  **/
16 
17 /**
18  * @file VolWriter.ih
19  * @author David Coeurjolly (\c david.coeurjolly@liris.cnrs.fr )
20  * Laboratoire d'InfoRmatique en Image et Systèmes d'information - LIRIS (CNRS, UMR 5205), CNRS, France
21  *
22  * @date 2010/07/22
23  *
24  * Implementation of inline methods defined in VolWriter.h
25  *
26  * This file is part of the DGtal library.
27  */
28 
29 
30 //////////////////////////////////////////////////////////////////////////////
31 #include <cstdlib>
32 #include <fstream>
33 #include <sstream>
34 #include "DGtal/io/Color.h"
35 #include <boost/iostreams/filtering_streambuf.hpp>
36 #include <boost/iostreams/copy.hpp>
37 #include <boost/iostreams/filter/zlib.hpp>
38 
39 //////////////////////////////////////////////////////////////////////////////
40 
41 ///////////////////////////////////////////////////////////////////////////////
42 // IMPLEMENTATION of inline methods.
43 ///////////////////////////////////////////////////////////////////////////////
44 
45 
46 namespace DGtal {
47  template<typename I,typename F>
48  bool VolWriter<I,F>::exportVol(const std::string & filename,
49  const I & aImage,
50  const bool compressed,
51  const Functor & aFunctor)
52  {
53  DGtal::IOException dgtalio;
54 
55  std::ofstream out;
56  typename I::Domain domain = aImage.domain();
57  const typename I::Domain::Point &upBound = domain.upperBound();
58  const typename I::Domain::Point &lowBound = domain.lowerBound();
59  typename I::Domain::Point p = I::Domain::Point::diagonal(1);
60  typename I::Domain::Vector size = (upBound - lowBound) + p;
61  typename I::Domain::Vector center = lowBound + ((upBound - lowBound)/2);
62 
63  typename I::Value val;
64 
65  try
66  {
67  std::stringstream header;
68  std::stringstream main;
69  out.open(filename.c_str(), std::ios::out | std::ios::binary);
70 
71  //Vol format
72  header << "Center-X: " << center[0] <<std::endl;
73  header << "Center-Y: " << center[1] <<std::endl;
74  header << "Center-Z: " << center[2] <<std::endl;
75  header << "X: "<< size[0]<<std::endl;
76  header << "Y: "<< size[1]<<std::endl;
77  header << "Z: "<< size[2]<<std::endl;
78  header << "Voxel-Size: 1"<<std::endl;
79  header << "Alpha-Color: 0"<<std::endl;
80  header << "Voxel-Endian: 0"<<std::endl;
81  header << "Int-Endian: 0123"<<std::endl;
82  if (compressed)
83  header << "Version: 3"<<std::endl;
84  else
85  header << "Version: 2"<<std::endl;
86 
87  header << "."<<std::endl;
88 
89  //We scan the domain
90  for(typename I::Domain::ConstIterator it = domain.begin(), itend=domain.end();
91  it!=itend;
92  ++it)
93  {
94  val = aImage( (*it) );
95  main.put( aFunctor(val) );
96  }
97 
98  if (compressed)
99  {
100  boost::iostreams::filtering_streambuf<boost::iostreams::input> out_compressed;
101  out_compressed.push(boost::iostreams::zlib_compressor());
102  out_compressed.push( main );
103  boost::iostreams::copy(out_compressed, header);
104  boost::iostreams::copy(header, out);
105  out.close();
106  }
107  else
108  {
109  //We flush the header
110  out << header.str();
111  out.close();
112  out.open(filename.c_str(),std::ios_base::binary | std::ios_base::app);
113  out << main.str();
114  out.close();
115  }
116  }
117  catch( ... )
118  {
119  trace.error() << "Vol writer IO error on export " << filename << std::endl;
120  throw dgtalio;
121  }
122  return true;
123  }
124 
125 }//namespace