diff --git a/modules/io/pymod/export_map_io.cc b/modules/io/pymod/export_map_io.cc index 6f30e29616033f81e30b91c2cc4dbdb147895118..e2b10e158a946cb5c1a768eb843766fe14b25aaf 100644 --- a/modules/io/pymod/export_map_io.cc +++ b/modules/io/pymod/export_map_io.cc @@ -132,6 +132,8 @@ void export_map_io() .def("GetFormat", &TIF::GetFormat) .def("SetSigned", &TIF::SetSigned) .def("GetSigned", &TIF::GetSigned) + .def("SetBitDepth", &TIF::SetBitDepth) + .def("GetBitDepth", &TIF::GetBitDepth) .def("GetPhasecolor", &TIF::GetPhasecolor) .def("SetPhasecolor", &TIF::SetPhasecolor) .def("SetSubimage", &TIF::SetSubimage) @@ -143,9 +145,13 @@ void export_map_io() .def("GetNormalizeOnSave", &PNG::GetNormalizeOnSave) ; - class_<DAT, bases<ImageFormatBase> >("DAT", init<bool,Endianess>((arg("normalize_on_save") = false,arg("endianess") = OST_LOCAL_ENDIAN))) - .def("SetNormalizeOnSave", &PNG::SetNormalizeOnSave) - .def("GetNormalizeOnSave", &PNG::GetNormalizeOnSave) + class_<DAT, bases<ImageFormatBase> >("DAT", init<bool,Format,bool,Endianess>((arg("normalize_on_save") = false,arg("format")=OST_DEFAULT_FORMAT,arg("signed")=false,arg("endianess") = OST_LOCAL_ENDIAN))) + .def("SetNormalizeOnSave", &DAT::SetNormalizeOnSave) + .def("GetNormalizeOnSave", &DAT::GetNormalizeOnSave) + .def("SetSigned", &DAT::SetSigned) + .def("GetSigned", &DAT::GetSigned) + .def("SetBitDepth", &DAT::SetBitDepth) + .def("GetBitDepth", &DAT::GetBitDepth) ; class_<JPK, bases<TIF> >("JPK", init<boost::logic::tribool,Format,bool,bool,int> diff --git a/modules/io/src/img/map_io_dat_handler.cc b/modules/io/src/img/map_io_dat_handler.cc index 988d590e5a333a8ab9a6d9ac17c175f17833d549..c2503261e5cd59aa257818b3da27d8e0e6cadfa2 100644 --- a/modules/io/src/img/map_io_dat_handler.cc +++ b/modules/io/src/img/map_io_dat_handler.cc @@ -17,6 +17,7 @@ // along with this library; if not, write to the Free Software Foundation, Inc., // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA //------------------------------------------------------------------------------ +#include <ost/stdint.hh> #include <boost/shared_array.hpp> #include <boost/filesystem/operations.hpp> #include <boost/filesystem/fstream.hpp> @@ -34,11 +35,33 @@ namespace ost { namespace io { String DAT::FORMAT_STRING = "defined_dat"; -DAT::DAT(bool normalize_on_save, Endianess end): - ImageFormatBase(FORMAT_STRING) +DAT::DAT(bool normalize_on_save, Format bit_depth, bool sign, Endianess end): + ImageFormatBase(FORMAT_STRING), + normalize_on_save_(normalize_on_save), + bit_depth_(bit_depth), + signed_(sign), + endianness_(end) { - normalize_on_save_ = normalize_on_save; - endianness_ = end; +} + +Format DAT::GetBitDepth() const +{ + return bit_depth_; +} + +void DAT::SetBitDepth (Format bitdepth) +{ + bit_depth_ = bitdepth; +} + +bool DAT::GetSigned () const +{ + return signed_; +} + +void DAT::SetSigned (bool sign) +{ + signed_ = sign; } Endianess DAT::GetEndianess() const @@ -92,7 +115,7 @@ void MapIODatHandler::Import(img::MapHandle& sh, const boost::filesystem::path& infile.close(); } -template <int CONVERSIONTYPE> +template <int CONVERSIONTYPE,typename DATATYPE> void real_filler(img::MapHandle& sh, std::istream& file) { BinaryIStream<CONVERSIONTYPE> file_bin(file); @@ -101,7 +124,7 @@ void real_filler(img::MapHandle& sh, std::istream& file) img::Progress::Instance().Register(&this_dummy,size[1],100); for(unsigned int row=0;row<size[1];row++) { for(unsigned int column=0;column<size[0];column++) { - short value; + DATATYPE value; file_bin >> value; sh.SetReal(img::Point(column,row),static_cast<Real>(value)); } @@ -110,7 +133,7 @@ void real_filler(img::MapHandle& sh, std::istream& file) img::Progress::Instance().DeRegister(&this_dummy); } -template <int CONVERSIONTYPE> +template <int CONVERSIONTYPE,typename DATATYPE> void real_dumper(const img::MapHandle& sh, std::ostream& file, const DAT& formatdat) { BinaryOStream<CONVERSIONTYPE> file_bin(file); @@ -124,7 +147,7 @@ void real_dumper(const img::MapHandle& sh, std::ostream& file, const DAT& format for(unsigned int row=0;row<size[1];row++) { for(unsigned int column=0;column<size[0];column++) { - file_bin << static_cast<short>(norm.Convert(sh.GetReal(img::Point(column,row)))); + file_bin << static_cast<DATATYPE>(norm.Convert(sh.GetReal(img::Point(column,row)))); } img::Progress::Instance().AdvanceProgress(&this_dummy); } @@ -151,21 +174,168 @@ void MapIODatHandler::Import(img::MapHandle& sh, std::istream& file, const Image uint filesize = end-start; file.seekg(curr_pos,std::ios::beg); - unsigned int size=static_cast<unsigned int>(sqrt(filesize/2.0)); - // default origin is top-left - sh.Reset(img::Extent(img::Point(0,0),img::Size(size,size)), img::REAL, img::SPATIAL); - - switch(formatdat.GetEndianess()) { - case OST_BIG_ENDIAN: - real_filler<OST_BIG_ENDIAN>(sh,file); + double datasize=1.0; + switch(formatdat.GetBitDepth()){ + case OST_BIT8_FORMAT: + case OST_DEFAULT_FORMAT: + datasize=1.0; + break; + case OST_BIT16_FORMAT: + datasize=2.0; break; - case OST_LITTLE_ENDIAN: - real_filler<OST_LITTLE_ENDIAN>(sh,file); + case OST_BIT32_FORMAT: + datasize=4.0; break; - case OST_VAX_DATA: - real_filler<OST_VAX_DATA>(sh,file); + case OST_FLOAT_FORMAT: + datasize=sizeof(float); break; - } + case OST_DOUBLE_FORMAT: + datasize=sizeof(double); + break; + } + unsigned int size=static_cast<unsigned int>(sqrt(filesize/datasize)); + // default origin is top-left + sh.Reset(img::Extent(img::Point(0,0),img::Size(size,size)), img::REAL, img::SPATIAL); + + if(formatdat.GetSigned()){ + switch(formatdat.GetBitDepth()){ + case OST_BIT8_FORMAT: + case OST_DEFAULT_FORMAT: + switch(formatdat.GetEndianess()) { + case OST_BIG_ENDIAN: + real_filler<OST_BIG_ENDIAN,int8_t>(sh,file); + break; + case OST_LITTLE_ENDIAN: + real_filler<OST_LITTLE_ENDIAN,int8_t>(sh,file); + break; + case OST_VAX_DATA: + real_filler<OST_VAX_DATA,int8_t>(sh,file); + break; + } + break; + case OST_BIT16_FORMAT: + switch(formatdat.GetEndianess()) { + case OST_BIG_ENDIAN: + real_filler<OST_BIG_ENDIAN,int16_t>(sh,file); + break; + case OST_LITTLE_ENDIAN: + real_filler<OST_LITTLE_ENDIAN,int16_t>(sh,file); + break; + case OST_VAX_DATA: + real_filler<OST_VAX_DATA,int16_t>(sh,file); + break; + } + break; + case OST_BIT32_FORMAT: + switch(formatdat.GetEndianess()) { + case OST_BIG_ENDIAN: + real_filler<OST_BIG_ENDIAN,int32_t>(sh,file); + break; + case OST_LITTLE_ENDIAN: + real_filler<OST_LITTLE_ENDIAN,int32_t>(sh,file); + break; + case OST_VAX_DATA: + real_filler<OST_VAX_DATA,int32_t>(sh,file); + break; + } + break; + case OST_FLOAT_FORMAT: + switch(formatdat.GetEndianess()) { + case OST_BIG_ENDIAN: + real_filler<OST_BIG_ENDIAN,float>(sh,file); + break; + case OST_LITTLE_ENDIAN: + real_filler<OST_LITTLE_ENDIAN,float>(sh,file); + break; + case OST_VAX_DATA: + real_filler<OST_VAX_DATA,float>(sh,file); + break; + } + break; + case OST_DOUBLE_FORMAT: + switch(formatdat.GetEndianess()) { + case OST_BIG_ENDIAN: + real_filler<OST_BIG_ENDIAN,double>(sh,file); + break; + case OST_LITTLE_ENDIAN: + real_filler<OST_LITTLE_ENDIAN,double>(sh,file); + break; + case OST_VAX_DATA: + real_filler<OST_VAX_DATA,double>(sh,file); + break; + } + break; + } + }else{ + switch(formatdat.GetBitDepth()){ + case OST_BIT8_FORMAT: + case OST_DEFAULT_FORMAT: + switch(formatdat.GetEndianess()) { + case OST_BIG_ENDIAN: + real_filler<OST_BIG_ENDIAN,uint8_t>(sh,file); + break; + case OST_LITTLE_ENDIAN: + real_filler<OST_LITTLE_ENDIAN,uint8_t>(sh,file); + break; + case OST_VAX_DATA: + real_filler<OST_VAX_DATA,uint8_t>(sh,file); + break; + } + break; + case OST_BIT16_FORMAT: + switch(formatdat.GetEndianess()) { + case OST_BIG_ENDIAN: + real_filler<OST_BIG_ENDIAN,uint16_t>(sh,file); + break; + case OST_LITTLE_ENDIAN: + real_filler<OST_LITTLE_ENDIAN,uint16_t>(sh,file); + break; + case OST_VAX_DATA: + real_filler<OST_VAX_DATA,uint16_t>(sh,file); + break; + } + break; + case OST_BIT32_FORMAT: + switch(formatdat.GetEndianess()) { + case OST_BIG_ENDIAN: + real_filler<OST_BIG_ENDIAN,uint32_t>(sh,file); + break; + case OST_LITTLE_ENDIAN: + real_filler<OST_LITTLE_ENDIAN,uint32_t>(sh,file); + break; + case OST_VAX_DATA: + real_filler<OST_VAX_DATA,uint32_t>(sh,file); + break; + } + break; + case OST_FLOAT_FORMAT: + switch(formatdat.GetEndianess()) { + case OST_BIG_ENDIAN: + real_filler<OST_BIG_ENDIAN,float>(sh,file); + break; + case OST_LITTLE_ENDIAN: + real_filler<OST_LITTLE_ENDIAN,float>(sh,file); + break; + case OST_VAX_DATA: + real_filler<OST_VAX_DATA,float>(sh,file); + break; + } + break; + case OST_DOUBLE_FORMAT: + switch(formatdat.GetEndianess()) { + case OST_BIG_ENDIAN: + real_filler<OST_BIG_ENDIAN,double>(sh,file); + break; + case OST_LITTLE_ENDIAN: + real_filler<OST_LITTLE_ENDIAN,double>(sh,file); + break; + case OST_VAX_DATA: + real_filler<OST_VAX_DATA,double>(sh,file); + break; + } + break; + } + } } void MapIODatHandler::Export(const img::MapHandle& mh2, @@ -197,17 +367,145 @@ void MapIODatHandler::Export(const img::MapHandle& sh, std::ostream& file,const throw IOException("DAT IO: Dat format only supports square 2D images"); } - switch(formatdat.GetEndianess()) { - case OST_BIG_ENDIAN: - real_dumper<OST_BIG_ENDIAN>(sh,file,formatdat); - break; - case OST_LITTLE_ENDIAN: - real_dumper<OST_LITTLE_ENDIAN>(sh,file,formatdat); - break; - case OST_VAX_DATA: - real_dumper<OST_VAX_DATA>(sh,file,formatdat); - break; - } + if(formatdat.GetSigned()){ + switch(formatdat.GetBitDepth()){ + case OST_BIT8_FORMAT: + case OST_DEFAULT_FORMAT: + switch(formatdat.GetEndianess()) { + case OST_BIG_ENDIAN: + real_dumper<OST_BIG_ENDIAN,int8_t>(sh,file,formatdat); + break; + case OST_LITTLE_ENDIAN: + real_dumper<OST_LITTLE_ENDIAN,int8_t>(sh,file,formatdat); + break; + case OST_VAX_DATA: + real_dumper<OST_VAX_DATA,int8_t>(sh,file,formatdat); + break; + } + break; + case OST_BIT16_FORMAT: + switch(formatdat.GetEndianess()) { + case OST_BIG_ENDIAN: + real_dumper<OST_BIG_ENDIAN,int16_t>(sh,file,formatdat); + break; + case OST_LITTLE_ENDIAN: + real_dumper<OST_LITTLE_ENDIAN,int16_t>(sh,file,formatdat); + break; + case OST_VAX_DATA: + real_dumper<OST_VAX_DATA,int16_t>(sh,file,formatdat); + break; + } + break; + case OST_BIT32_FORMAT: + switch(formatdat.GetEndianess()) { + case OST_BIG_ENDIAN: + real_dumper<OST_BIG_ENDIAN,int32_t>(sh,file,formatdat); + break; + case OST_LITTLE_ENDIAN: + real_dumper<OST_LITTLE_ENDIAN,int32_t>(sh,file,formatdat); + break; + case OST_VAX_DATA: + real_dumper<OST_VAX_DATA,int32_t>(sh,file,formatdat); + break; + } + break; + case OST_FLOAT_FORMAT: + switch(formatdat.GetEndianess()) { + case OST_BIG_ENDIAN: + real_dumper<OST_BIG_ENDIAN,float>(sh,file,formatdat); + break; + case OST_LITTLE_ENDIAN: + real_dumper<OST_LITTLE_ENDIAN,float>(sh,file,formatdat); + break; + case OST_VAX_DATA: + real_dumper<OST_VAX_DATA,float>(sh,file,formatdat); + break; + } + break; + case OST_DOUBLE_FORMAT: + switch(formatdat.GetEndianess()) { + case OST_BIG_ENDIAN: + real_dumper<OST_BIG_ENDIAN,double>(sh,file,formatdat); + break; + case OST_LITTLE_ENDIAN: + real_dumper<OST_LITTLE_ENDIAN,double>(sh,file,formatdat); + break; + case OST_VAX_DATA: + real_dumper<OST_VAX_DATA,double>(sh,file,formatdat); + break; + } + break; + } + }else{ + switch(formatdat.GetBitDepth()){ + case OST_BIT8_FORMAT: + case OST_DEFAULT_FORMAT: + switch(formatdat.GetEndianess()) { + case OST_BIG_ENDIAN: + real_dumper<OST_BIG_ENDIAN,int8_t>(sh,file,formatdat); + break; + case OST_LITTLE_ENDIAN: + real_dumper<OST_LITTLE_ENDIAN,int8_t>(sh,file,formatdat); + break; + case OST_VAX_DATA: + real_dumper<OST_VAX_DATA,int8_t>(sh,file,formatdat); + break; + } + break; + case OST_BIT16_FORMAT: + switch(formatdat.GetEndianess()) { + case OST_BIG_ENDIAN: + real_dumper<OST_BIG_ENDIAN,int16_t>(sh,file,formatdat); + break; + case OST_LITTLE_ENDIAN: + real_dumper<OST_LITTLE_ENDIAN,int16_t>(sh,file,formatdat); + break; + case OST_VAX_DATA: + real_dumper<OST_VAX_DATA,int16_t>(sh,file,formatdat); + break; + } + break; + case OST_BIT32_FORMAT: + switch(formatdat.GetEndianess()) { + case OST_BIG_ENDIAN: + real_dumper<OST_BIG_ENDIAN,int32_t>(sh,file,formatdat); + break; + case OST_LITTLE_ENDIAN: + real_dumper<OST_LITTLE_ENDIAN,int32_t>(sh,file,formatdat); + break; + case OST_VAX_DATA: + real_dumper<OST_VAX_DATA,int32_t>(sh,file,formatdat); + break; + } + break; + case OST_FLOAT_FORMAT: + switch(formatdat.GetEndianess()) { + case OST_BIG_ENDIAN: + real_dumper<OST_BIG_ENDIAN,float>(sh,file,formatdat); + break; + case OST_LITTLE_ENDIAN: + real_dumper<OST_LITTLE_ENDIAN,float>(sh,file,formatdat); + break; + case OST_VAX_DATA: + real_dumper<OST_VAX_DATA,float>(sh,file,formatdat); + break; + } + break; + case OST_DOUBLE_FORMAT: + switch(formatdat.GetEndianess()) { + case OST_BIG_ENDIAN: + real_dumper<OST_BIG_ENDIAN,double>(sh,file,formatdat); + break; + case OST_LITTLE_ENDIAN: + real_dumper<OST_LITTLE_ENDIAN,double>(sh,file,formatdat); + break; + case OST_VAX_DATA: + real_dumper<OST_VAX_DATA,double>(sh,file,formatdat); + break; + } + break; + } + } } }} // namespaces diff --git a/modules/io/src/img/map_io_dat_handler.hh b/modules/io/src/img/map_io_dat_handler.hh index 92335aa170b08ef1ac32b36b25436471810c0746..9244c705be6870ddd82f74d3a06c4127c22d0143 100644 --- a/modules/io/src/img/map_io_dat_handler.hh +++ b/modules/io/src/img/map_io_dat_handler.hh @@ -34,7 +34,13 @@ class DLLEXPORT_OST_IO DAT: public ImageFormatBase public: - DAT(bool normalize_on_save = true,Endianess endianness = OST_LOCAL_ENDIAN); + DAT(bool normalize_on_save = true, Format bit_depth = OST_DEFAULT_FORMAT, bool sign = false,Endianess endianness = OST_LOCAL_ENDIAN); + + Format GetBitDepth() const; + void SetBitDepth ( Format bitdepth); + + bool GetSigned () const; + void SetSigned (bool sign); Endianess GetEndianess() const; void SetEndianess(Endianess end); @@ -45,6 +51,8 @@ class DLLEXPORT_OST_IO DAT: public ImageFormatBase private: bool normalize_on_save_; + Format bit_depth_; + bool signed_; Endianess endianness_; }; diff --git a/modules/io/src/img/map_io_tiff_handler.cc b/modules/io/src/img/map_io_tiff_handler.cc index 10c1a5c3f754a2a9b70cfd9da68f704b8e43cb45..26305654bb02c52523eae0bb7a35fd84a08ddd61 100644 --- a/modules/io/src/img/map_io_tiff_handler.cc +++ b/modules/io/src/img/map_io_tiff_handler.cc @@ -47,21 +47,21 @@ namespace ost { namespace io { String TIF::FORMAT_STRING="defined_tiff"; TIF::TIF(boost::logic::tribool normalize_on_save, Format bit_depth, bool sign, bool phasecolor, int subimage): - ImageFormatBase(FORMAT_STRING) + ImageFormatBase(FORMAT_STRING), + normalize_on_save_(normalize_on_save), + bit_depth_(bit_depth), + signed_(sign), + phasecolor_(phasecolor) { - normalize_on_save_ = normalize_on_save; - bit_depth_ = bit_depth; - signed_ = sign; - phasecolor_ = phasecolor; } TIF::TIF(String format_string, boost::logic::tribool normalize_on_save, Format bit_depth,bool sign, bool phasecolor, int subimage): - ImageFormatBase(format_string) + ImageFormatBase(FORMAT_STRING), + normalize_on_save_(normalize_on_save), + bit_depth_(bit_depth), + signed_(sign), + phasecolor_(phasecolor) { - normalize_on_save_ = normalize_on_save; - bit_depth_ = bit_depth; - signed_ = sign; - phasecolor_ = phasecolor; } Format TIF::GetBitDepth() const