00001
00008 #ifndef PRIP_UTIL_H
00009 #define PRIP_UTIL_H
00010
00011 #include "prip.h"
00012 #include <string>
00013 #include <FreeImagePlus.h>
00014 #include <cxcore/include/cxcore.h>
00015
00016
00017 namespace prip {
00018
00019
00027 class Util : private NonCopyable
00028 {
00029 public:
00038 static std::string base64Encode(const unsigned char*const bytesToEncode, unsigned int len);
00039
00046 static std::string base64Encode(const std::string & stringToEncode);
00047
00048
00055 static std::string base64Decode(const std::string & stringToDecode);
00056
00063 static fipImage raw2fipImage(const std::string & rawBuffer);
00064
00072 static IplImage* raw2IplImage(const std::string & rawBuffer);
00073
00074 public:
00075 ~Util(void) {}
00076
00077 private:
00078 Util(void) {}
00079
00080 };
00081
00082
00083 inline
00084 fipImage Util::raw2fipImage(const std::string & rawBuffer) {
00085 char* buffer = const_cast<char*>(rawBuffer.c_str());
00086 fipMemoryIO memory(reinterpret_cast<BYTE*>(buffer), static_cast<DWORD>(rawBuffer.length()*sizeof(BYTE)/sizeof(char)));
00087 fipImage img;
00088 img.loadFromMemory(memory);
00089 return img;
00090 }
00091
00092 inline
00093 IplImage* Util::raw2IplImage(const std::string & rawBuffer)
00094 {
00095 fipImage fipimg(raw2fipImage(rawBuffer));
00096 int channels, depth;
00097 switch (fipimg.getImageType())
00098 {
00099 case FIT_UINT16:
00100 channels = 1;
00101 depth = IPL_DEPTH_16U;
00102 break;
00103
00104 case FIT_INT16:
00105 channels = 1;
00106 depth = IPL_DEPTH_16S;
00107 break;
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117 case FIT_INT32:
00118 channels = 1;
00119 depth = IPL_DEPTH_32S;
00120 break;
00121
00122 case FIT_FLOAT:
00123 channels = 1;
00124 depth = IPL_DEPTH_32F;
00125 break;
00126
00127 case FIT_DOUBLE:
00128 channels = 1;
00129 depth = IPL_DEPTH_64F;
00130 break;
00131
00132 case FIT_COMPLEX:
00133 channels = 2;
00134 depth = IPL_DEPTH_64F;
00135 break;
00136
00137 case FIT_RGB16:
00138 channels = 3;
00139 depth = IPL_DEPTH_16U;
00140 break;
00141
00142 case FIT_RGBA16:
00143 channels = 4;
00144 depth = IPL_DEPTH_16U;
00145 break;
00146
00147 case FIT_RGBF:
00148 channels = 3;
00149 depth = IPL_DEPTH_32F;
00150 break;
00151
00152 case FIT_RGBAF:
00153 channels = 4;
00154 depth = IPL_DEPTH_32F;
00155 break;
00156
00157 case FIT_BITMAP:
00158 if (fipimg.isGrayscale())
00159 {
00160 channels = 1;
00161 depth = IPL_DEPTH_8U;
00162 } else {
00163 switch (fipimg.getColorType())
00164 {
00165 case FIC_RGB:
00166 channels = 3;
00167 break;
00168 case FIC_RGBALPHA:
00169 channels = 4;
00170 break;
00171 default:
00172 channels = -1;
00173 break;
00174 }
00175 if (channels == -1) break;
00176 switch (fipimg.getBitsPerPixel()/channels)
00177 {
00178 case 8:
00179 depth = IPL_DEPTH_8U;
00180 break;
00181 case 16:
00182 depth = IPL_DEPTH_16U;
00183 break;
00184 case 32:
00185 depth = IPL_DEPTH_32S;
00186 break;
00187 default:
00188 channels = -1;
00189 break;
00190 }
00191 }
00192
00193 default:
00194 channels = -1;
00195 break;
00196
00197 }
00198
00199 if (channels == -1) return NULL;
00200
00201 IplImage* img = cvCreateImage(cvSize(fipimg.getWidth(),fipimg.getHeight()),depth,channels);
00202
00203 uchar* imgdata;
00204 cvGetRawData(img,&imgdata);
00205 memcpy(imgdata,fipimg.accessPixels(),fipimg.getWidth()*fipimg.getHeight()*fipimg.getBitsPerPixel()/8);
00206 fipimg.clear();
00207
00208 return img;
00209 }
00210
00211 }
00212
00213 #endif