prip/include/Util.h

Go to the documentation of this file.
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 /* NOT SUPPORTED
00110    case FIT_UINT32:
00111       channels = 1;
00112       depth = IPL_DEPTH_32U;
00113       break;
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

Generated on Thu Nov 30 00:34:19 2006 for PRIP by  doxygen 1.4.7