30#include <DGtal/base/Common.h>
31#include <DGtal/io/readers/VolReader.h>
32#include <DGtal/helpers/StdDefs.h>
33#include <DGtal/images/Image.h>
34#include <DGtal/images/ImageContainerBySTLVector.h>
79void missingParam (
const std::string ¶m )
81 trace.error() <<
" Parameter: "<<param<<
" is required..";
82 trace.info() <<std::endl;
86template <
typename Word>
88std::ostream& write_word( std::ostream& outs, Word value )
90 for (
unsigned size =
sizeof( Word ); size; --size, value >>= 8)
91 outs.put(
static_cast <char> (value & 0xFF) );
96int main(
int argc,
char**argv)
103 std::string inputFileName;
104 std::string outputFileName{
"result.vox"};
105 app.description(
"Convert a vol (up to [0,126]^3) to a vox.\n The current exporter does not support custom colormaps, only the voxel values are exported \n Example: vol2vox -i ${DGtal}/examples/samples/Al.100.vol -o Al.100.vox");
106 app.add_option(
"-i,--input,1", inputFileName,
"Input vol file.")
108 ->check(CLI::ExistingFile);
109 app.add_option(
"-o,--output,2", outputFileName,
"Output filename.");
110 app.get_formatter()->column_width(40);
111 CLI11_PARSE(app, argc, argv);
114 typedef ImageContainerBySTLVector<Z3i::Domain, unsigned char> MyImageC;
115 trace.beginBlock(
"Loading..");
116 MyImageC imageL = VolReader< MyImageC >::importVol ( inputFileName );
119 if ( (imageL.domain().upperBound() - imageL.domain().lowerBound()).max() > 126 )
121 trace.error() <<
"Vol file too large (width > 126)."<<std::endl;
122 trace.info() << std::endl;
126 trace.beginBlock(
"Exporting...");
128 myfile.open (outputFileName, ios::out | ios::binary);
130 DGtal::uint32_t cpt=0;
131 for(
auto it = imageL.range().begin(), itend = imageL.range().end();
136 Point size = imageL.domain().upperBound() - imageL.domain().lowerBound();
161 trace.info()<<size<<std::endl;
164 myfile <<
'V'<<
'O'<<
'X'<<
' ';
166 write_word(myfile, (DGtal::uint32_t)150);
169 myfile <<
'M'<<
'A'<<
'I'<<
'N';
170 write_word(myfile,DGtal::uint32_t(0));
171 write_word(myfile,DGtal::uint32_t( (4+4+4 + 12 ) + ((4+ 4 + 4) + (4+ cpt*4))));
174 myfile <<
'S'<<
'I'<<
'Z'<<
'E';
175 write_word(myfile,DGtal::uint32_t(12));
176 write_word(myfile,DGtal::uint32_t(0));
177 write_word(myfile,DGtal::uint32_t(size[0]+1));
178 write_word(myfile,DGtal::uint32_t(size[1]+1));
179 write_word(myfile,DGtal::uint32_t(size[2]+1));
182 myfile <<
'X'<<
'Y'<<
'Z'<<
'I';
183 write_word(myfile, (DGtal::uint32_t)(4+cpt*4));
184 write_word(myfile,DGtal::uint32_t(0));
185 write_word(myfile, DGtal::uint32_t(cpt));
187 trace.info() <<
"Number of voxels= "<<cpt<<std::endl;
190 for(
auto it = imageL.domain().begin(), itend = imageL.domain().end();
192 if (imageL(*it) != 0)
194 Point p = (*it) - imageL.domain().lowerBound();
195 myfile.put((DGtal::uint8_t)p[0]);
196 myfile.put( (DGtal::uint8_t)p[1]);
197 myfile.put( (DGtal::uint8_t)p[2]);
198 myfile.put(imageL(*it));