From 608181a4f3157f838bb93bdd682a036f389ed3c3 Mon Sep 17 00:00:00 2001 From: andreas <andreas@5a81b35b-ba03-0410-adc8-b2c5c5119f08> Date: Wed, 18 Aug 2010 22:26:32 +0000 Subject: [PATCH] extended dat io handler to accept different bit depths git-svn-id: https://dng.biozentrum.unibas.ch/svn/openstructure/trunk@2653 5a81b35b-ba03-0410-adc8-b2c5c5119f08 --- modules/io/pymod/export_map_io.cc | 12 +- modules/io/src/img/map_io_dat_handler.cc | 360 ++++++++++++++++++++-- modules/io/src/img/map_io_dat_handler.hh | 10 +- modules/io/src/img/map_io_tiff_handler.cc | 20 +- 4 files changed, 357 insertions(+), 45 deletions(-) diff --git a/modules/io/pymod/export_map_io.cc b/modules/io/pymod/export_map_io.cc index 6f30e2961..e2b10e158 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 988d590e5..c2503261e 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 92335aa17..9244c705b 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 10c1a5c3f..26305654b 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 -- GitLab