TuttleOFX
1
|
00001 #ifndef _J2KREADER_HPP_ 00002 #define _J2KREADER_HPP_ 00003 00004 #include "J2KCommon.hpp" 00005 00006 #include <tuttle/plugin/global.hpp> 00007 00008 #include <openjpeg.h> 00009 00010 #include <boost/scoped_array.hpp> 00011 #include <boost/filesystem/fstream.hpp> 00012 00013 #include <string> 00014 00015 namespace tuttle { 00016 namespace io { 00017 00018 class J2KReader 00019 { 00020 public: 00021 J2KReader(); 00022 virtual ~J2KReader(); 00023 00024 void open(const std::string & filename); 00025 void decode(bool headeronly = false); 00026 void close(); 00027 inline bool componentsConform(); ///< Check if components have the same properties 00028 // Getters 00029 inline const size_t components() const; ///< Get number of components 00030 inline const size_t width(const size_t nc = 0) const; ///< Get width of nc component 00031 inline const size_t height(const size_t nc = 0) const; ///< Get height of nc component 00032 inline const size_t precision(const size_t nc = 0) const; ///< Get precision of nc component 00033 inline const uint8_t *compData(const size_t nc) const; ///< Get the nc component data 00034 inline bool imageReady() const; ///< Is image ready? 00035 private: 00036 OpenJpegStuffs _openjpeg; ///< OpenJpeg 2000 structs 00037 uint8_t *_fileData; ///< Image data 00038 std::ssize_t _dataLength; ///< Data length 00039 }; 00040 00041 inline bool J2KReader::imageReady() const 00042 { 00043 return _openjpeg.image && _fileData; 00044 } 00045 00046 inline bool J2KReader::componentsConform() 00047 { 00048 size_t nc = components(); 00049 if (nc > 0) 00050 { 00051 size_t i = 1; 00052 bool ret = true; 00053 size_t w = width(); 00054 size_t h = height(); 00055 size_t prec = precision(); 00056 while(ret && i < nc) 00057 { 00058 if (width(i) != w || height(i) != h || precision(i) != prec) 00059 { 00060 ret = false; 00061 } 00062 ++i; 00063 } 00064 return ret; 00065 } 00066 return false; 00067 } 00068 00069 inline const size_t J2KReader::components() const 00070 { 00071 if (!_openjpeg.image) 00072 { 00073 return 0; 00074 } 00075 else 00076 { 00077 return _openjpeg.image->numcomps; 00078 } 00079 } 00080 00081 inline const size_t J2KReader::width(const size_t nc /*= 0*/) const 00082 { 00083 if (!_openjpeg.image) 00084 { 00085 return 0; 00086 } 00087 else 00088 { 00089 return _openjpeg.image->x1 - _openjpeg.image->x0; 00090 } 00091 } 00092 00093 inline const size_t J2KReader::height(const size_t nc /*= 0*/) const 00094 { 00095 if (!_openjpeg.image) 00096 { 00097 return 0; 00098 } 00099 else 00100 { 00101 return _openjpeg.image->y1 - _openjpeg.image->y0; 00102 } 00103 } 00104 00105 inline const size_t J2KReader::precision(const size_t nc /*= 0*/) const 00106 { 00107 if (!_openjpeg.image) 00108 { 00109 return 0; 00110 } 00111 else 00112 { 00113 assert(nc < components()); 00114 return _openjpeg.image->comps[nc].prec; 00115 } 00116 } 00117 00118 /// @warning data are int packed! 00119 inline const uint8_t *J2KReader::compData(const size_t nc) const 00120 { 00121 if (!_openjpeg.image) 00122 { 00123 return NULL; 00124 } 00125 else 00126 { 00127 assert(nc < components()); 00128 return (uint8_t *)_openjpeg.image->comps[nc].data; 00129 } 00130 } 00131 00132 } 00133 } 00134 00135 #endif 00136