Image.cpp
上传用户:sz83729876
上传日期:2013-03-07
资源大小:4140k
文件大小:2k
源码类别:

OpenGL

开发平台:

Windows_Unix

  1. #include <stdio.h>
  2. #include "Image.h"
  3. #include "Jpegjpegdecoder.h"
  4. CImage::CImage()
  5. {
  6.     m_cData = NULL;
  7.     m_dwWidth = 0;
  8.     m_dwHeight = 0;
  9. }
  10.         
  11. CImage::~CImage()
  12. {
  13.     if ( m_cData )
  14.     {
  15.         delete[] m_cData;
  16.         m_cData = NULL;
  17.     }
  18. }
  19. bool CImage::LoadFromJPEG( std::string strFilename )
  20. {
  21.     Pjpeg_decoder_file_stream Pinput_stream = new jpeg_decoder_file_stream();
  22.     if (Pinput_stream->open( strFilename.c_str() ))
  23.     {
  24.         delete Pinput_stream;
  25.         return false;
  26.     }
  27.     Pjpeg_decoder Pd = new jpeg_decoder( Pinput_stream, false );
  28.     if (Pd->get_error_code() != 0)
  29.     {
  30.         delete Pd;
  31.         delete Pinput_stream;
  32.         return false;
  33.     }
  34.     //printf("Width: %in", Pd->get_width());
  35.     //printf("Height: %in", Pd->get_height());
  36.     //printf("Components: %in", Pd->get_num_components());
  37.     m_dwWidth = Pd->get_width();
  38.     m_dwHeight = Pd->get_height();
  39.     m_dwDepth = 24;//Pd->get_num_components() * 8;
  40.     if (Pd->begin())
  41.     {
  42.         delete Pd;
  43.         delete Pinput_stream;
  44.         return false;
  45.     }
  46.     unsigned char *Pbuf = NULL;
  47.     if (Pd->get_num_components() == 3)
  48.     {
  49.         Pbuf = new unsigned char[ Pd->get_width() * 3 ];
  50.         if (!Pbuf)
  51.         {
  52.             delete Pd;
  53.             delete Pinput_stream;
  54.             return false;
  55.         }
  56.     }
  57.     int lines_decoded = 0;
  58.     m_cData = new unsigned char[ Pd->get_width() * Pd->get_height() * Pd->get_num_components() ];
  59.     int pos=0;
  60.     for ( ; ; )
  61.     {
  62.         void *Pscan_line_ofs;
  63.         uint scan_line_len; 
  64.         if (Pd->decode(&Pscan_line_ofs, &scan_line_len))
  65.             break;
  66.         lines_decoded++;
  67.         if (Pd->get_num_components() == 3)
  68.         {
  69.             uchar *Psb = (uchar *)Pscan_line_ofs;
  70.             uchar *Pdb = Pbuf;
  71.             int src_bpp = Pd->get_bytes_per_pixel();
  72.             for (int x = Pd->get_width(); x > 0; x--, Psb += src_bpp, Pdb += 3 )
  73.             {
  74.                 m_cData[pos+0] = Psb[0];
  75.                 m_cData[pos+1] = Psb[1];
  76.                 m_cData[pos+2] = Psb[2];
  77.                 pos += 3;
  78.             }
  79.         }
  80.     }
  81.     delete Pbuf;
  82.     if (Pd->get_error_code())
  83.     {
  84.         delete Pd;
  85.         delete Pinput_stream;
  86.         //delete m_cData;
  87.         return false;
  88.     }
  89.     delete Pd;
  90.     delete Pinput_stream;
  91.     return true;
  92. }