溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

WINCE下使用OPENGL(2)

發(fā)布時(shí)間:2020-07-15 05:07:08 來源:網(wǎng)絡(luò) 閱讀:479 作者:WZM3558862 欄目:編程語言

[cpp] view plain copy

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

  2. filename:   CImgLoader.cpp 

  3. created:    2011-01-05 

  4. author:     firehood 

  5.  

  6. purpose:    文件加載類,將外部圖片資源轉(zhuǎn)化成繪制紋理時(shí)所需的位圖數(shù)據(jù) 

  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位圖實(shí)際值的地址指針  

  67.     // 若為Bottom-Up(從下到上)的位圖,則指向buffer的結(jié)尾  

  68.     // 若為Top-Down(從上到下)的位圖,則指向buffer的開頭  

  69.     // int nBytesPP = nBPP >> 3;     // 左移三位即除以8,獲取圖像每像素字節(jié)數(shù)  

  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. // 獲取圖片數(shù)據(jù)  

  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. }  


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI