[cpp] view plain copy

  1. /******************************************************************** 

  2. filename:   CImgLoader.cpp 

  3. created:    2011-01-05 

  4. author:     firehood 

  5.  

  6. purpose:    文件加载类,将外部图片资源转化成绘制纹理时所需的位图数据 

  7.             图片格式支持bmp、png、jpg. 

  8. *********************************************************************/  

  9.   

  10. #include "StdAfx.h"  

  11. #include "ImgLoader.h"  

  12. // IImage Includer  

  13. #include <imaging.h>  

  14. #include <initguid.h>  

  15. #include <imgguids.h>   

  16. // IImage lib  

  17. #pragma comment(lib, "Imaging.lib")  

  18.   

  19. CImgLoader::CImgLoader(void)  

  20. {  

  21.     m_pImage = NULL;  

  22.     m_Width = 0;  

  23.     m_Height = 0;  

  24. }  

  25.   

  26. CImgLoader::~CImgLoader(void)  

  27. {  

  28. }  

  29.   

  30. // 加载图片资源  

  31. BOOL CImgLoader::Load(LPCTSTR lpFileName)  

  32. {  

  33.     IImagingFactory *pImgFactory = NULL;  

  34.     IImage *pImage = NULL;  

  35.     IBitmapImage *pBmpImg = NULL;  

  36.     //   

  37.     CoInitializeEx(NULL, COINIT_MULTITHREADED);  

  38.     if (!SUCCEEDED(CoCreateInstance(CLSID_ImagingFactory, NULL, CLSCTX_INPROC_SERVER, IID_IImagingFactory, (void **) &pImgFactory)))   

  39.         return FALSE;  

  40.     if (!SUCCEEDED(pImgFactory->CreateImageFromFile(lpFileName, &pImage)))   

  41.         return FALSE;  

  42.     // 获取图像大小信息  

  43.     ImageInfo ImgInfo;  

  44.     pImage->GetImageInfo(&ImgInfo);  

  45.   

  46.     m_Width = ImgInfo.Width;  

  47.     m_Height = ImgInfo.Height;  

  48.   

  49.     if (FAILED(pImgFactory->CreateBitmapFromImage(  

  50.         pImage,m_Width,m_Height,PixelFormat24bppRGB,  

  51.         InterpolationHintDefault,&pBmpImg)))  

  52.     {  

  53.         return FALSE;  

  54.     }  

  55.     RECT rect = {0,0,m_Width,m_Height};  

  56.     BitmapData *BmpData = new BitmapData;  

  57.   

  58.     if (FAILED(pBmpImg->LockBits(&rect,  

  59.         ImageLockModeRead|ImageLockModeWrite,  

  60.         PixelFormat24bppRGB,BmpData)))  

  61.     {  

  62.         return FALSE;  

  63.     }  

  64.     int line = BmpData->Stride;  

  65.     LPBYTE lpData, lpLine, lpCurPixel;   

  66.     lpData = lpLine = (LPBYTE)BmpData->Scan0;   // 获取BMP位图实际值的地址指针  

  67.     // 若为Bottom-Up(从下到上)的位图,则指向buffer的结尾  

  68.     // 若为Top-Down(从上到下)的位图,则指向buffer的开头  

  69.     // int nBytesPP = nBPP >> 3;     // 左移三位即除以8,获取图像每像素字节数  

  70.     m_pImage = new unsigned char[m_Width * m_Height * 3];  

  71.     memset(m_pImage, 0, m_Width * m_Height * 3);  

  72.     if(m_pImage == NULL)  

  73.         return FALSE;  

  74.     if (line>0)  

  75.     {  

  76.         int pos = m_Width * m_Height * 3-1;  

  77.         for(int i = 0; i<m_Height; i++)                  // 行  

  78.         {  

  79.             lpLine = lpData + i * line;               // 获取图像每一行地址指针  

  80.             for(int j = m_Width-1; j>-1; j--)           // 列  

  81.             {  

  82.                 lpCurPixel = lpLine + j * 3;          // 获取每行每像素地址指针  

  83.                 m_pImage[pos--] = *lpCurPixel ;       // R  

  84.                 m_pImage[pos--] = *(lpCurPixel + 1);  // G  

  85.                 m_pImage[pos--] = *(lpCurPixel + 2);  // B  

  86.             }  

  87.         }  

  88.     }  

  89.     else  

  90.     {  

  91.         int pos = 0 ;  

  92.         for(int i = m_Height-1; i>-1; i--)               // 行  

  93.         {  

  94.             lpLine = lpData + i * line;               // 获取图像每一行地址指针  

  95.             for(int j = 0; j<m_Width; j++)              // 列  

  96.             {  

  97.                 lpCurPixel = lpLine + j * 3;          // 获取每行每像素地址指针  

  98.                 m_pImage[pos++] = *(lpCurPixel + 2);  // R  

  99.                 m_pImage[pos++] = *(lpCurPixel + 1);  // G  

  100.                 m_pImage[pos++] = *lpCurPixel;        // B  

  101.             }  

  102.         }  

  103.     }  

  104.     if (FAILED(pBmpImg->UnlockBits(BmpData)))  

  105.     {  

  106.         return FALSE;  

  107.     }  

  108.     delete BmpData;  

  109.     pBmpImg = NULL;  

  110.     pImage->Release();   

  111.     pImgFactory->Release();   

  112.     return TRUE;  

  113. }  

  114.   

  115. // 获取图片数据  

  116. unsigned char* CImgLoader::GetBmpImage(void)  

  117. {  

  118.     return m_pImage;  

  119. }  

  120.   

  121. // 获取图像宽度  

  122. int CImgLoader::Width()  

  123. {  

  124.     return m_Width;  

  125. }  

  126.   

  127. // 获取图像高度  

  128. int CImgLoader::Height()  

  129. {  

  130.     return m_Height;  

  131. }  

  132.   

  133. // 释放图片资源  

  134. void CImgLoader::Free()  

  135. {  

  136.     if(m_pImage)  

  137.     {  

  138.         delete []m_pImage;  

  139.         m_pImage = NULL;  

  140.     }  

  141. }