WINCE下使用OPENGL(2)

[cpp] view plain copy

  1. /********************************************************************
  2. filename:   CImgLoader.cpp
  3. created:    2011-01-05
  4. author:     firehood
  5. purpose:    文件加载类,将外部图片资源转化成绘制纹理时所需的位图数据
  6. 图片格式支持bmp、png、jpg.
  7. *********************************************************************/
  8. #include "StdAfx.h"
  9. #include "ImgLoader.h"
  10. // IImage Includer
  11. #include <imaging.h>
  12. #include <initguid.h>
  13. #include <imgguids.h>
  14. // IImage lib
  15. #pragma comment(lib, "Imaging.lib")
  16. CImgLoader::CImgLoader(void)
  17. {
  18. m_pImage = NULL;
  19. m_Width = 0;
  20. m_Height = 0;
  21. }
  22. CImgLoader::~CImgLoader(void)
  23. {
  24. }
  25. // 加载图片资源
  26. BOOL CImgLoader::Load(LPCTSTR lpFileName)
  27. {
  28. IImagingFactory *pImgFactory = NULL;
  29. IImage *pImage = NULL;
  30. IBitmapImage *pBmpImg = NULL;
  31. //
  32. CoInitializeEx(NULL, COINIT_MULTITHREADED);
  33. if (!SUCCEEDED(CoCreateInstance(CLSID_ImagingFactory, NULL, CLSCTX_INPROC_SERVER, IID_IImagingFactory, (void **) &pImgFactory)))
  34. return FALSE;
  35. if (!SUCCEEDED(pImgFactory->CreateImageFromFile(lpFileName, &pImage)))
  36. return FALSE;
  37. // 获取图像大小信息
  38. ImageInfo ImgInfo;
  39. pImage->GetImageInfo(&ImgInfo);
  40. m_Width = ImgInfo.Width;
  41. m_Height = ImgInfo.Height;
  42. if (FAILED(pImgFactory->CreateBitmapFromImage(
  43. pImage,m_Width,m_Height,PixelFormat24bppRGB,
  44. InterpolationHintDefault,&pBmpImg)))
  45. {
  46. return FALSE;
  47. }
  48. RECT rect = {0,0,m_Width,m_Height};
  49. BitmapData *BmpData = new BitmapData;
  50. if (FAILED(pBmpImg->LockBits(&rect,
  51. ImageLockModeRead|ImageLockModeWrite,
  52. PixelFormat24bppRGB,BmpData)))
  53. {
  54. return FALSE;
  55. }
  56. int line = BmpData->Stride;
  57. LPBYTE lpData, lpLine, lpCurPixel;
  58. lpData = lpLine = (LPBYTE)BmpData->Scan0;   // 获取BMP位图实际值的地址指针
  59. // 若为Bottom-Up(从下到上)的位图,则指向buffer的结尾
  60. // 若为Top-Down(从上到下)的位图,则指向buffer的开头
  61. // int nBytesPP = nBPP >> 3;     // 左移三位即除以8,获取图像每像素字节数
  62. m_pImage = new unsigned char[m_Width * m_Height * 3];
  63. memset(m_pImage, 0, m_Width * m_Height * 3);
  64. if(m_pImage == NULL)
  65. return FALSE;
  66. if (line>0)
  67. {
  68. int pos = m_Width * m_Height * 3-1;
  69. for(int i = 0; i<m_Height; i++)                  // 行
  70. {
  71. lpLine = lpData + i * line;               // 获取图像每一行地址指针
  72. for(int j = m_Width-1; j>-1; j--)           // 列
  73. {
  74. lpCurPixel = lpLine + j * 3;          // 获取每行每像素地址指针
  75. m_pImage[pos--] = *lpCurPixel ;       // R
  76. m_pImage[pos--] = *(lpCurPixel + 1);  // G
  77. m_pImage[pos--] = *(lpCurPixel + 2);  // B
  78. }
  79. }
  80. }
  81. else
  82. {
  83. int pos = 0 ;
  84. for(int i = m_Height-1; i>-1; i--)               // 行
  85. {
  86. lpLine = lpData + i * line;               // 获取图像每一行地址指针
  87. for(int j = 0; j<m_Width; j++)              // 列
  88. {
  89. lpCurPixel = lpLine + j * 3;          // 获取每行每像素地址指针
  90. m_pImage[pos++] = *(lpCurPixel + 2);  // R
  91. m_pImage[pos++] = *(lpCurPixel + 1);  // G
  92. m_pImage[pos++] = *lpCurPixel;        // B
  93. }
  94. }
  95. }
  96. if (FAILED(pBmpImg->UnlockBits(BmpData)))
  97. {
  98. return FALSE;
  99. }
  100. delete BmpData;
  101. pBmpImg = NULL;
  102. pImage->Release();
  103. pImgFactory->Release();
  104. return TRUE;
  105. }
  106. // 获取图片数据
  107. unsigned char* CImgLoader::GetBmpImage(void)
  108. {
  109. return m_pImage;
  110. }
  111. // 获取图像宽度
  112. int CImgLoader::Width()
  113. {
  114. return m_Width;
  115. }
  116. // 获取图像高度
  117. int CImgLoader::Height()
  118. {
  119. return m_Height;
  120. }
  121. // 释放图片资源
  122. void CImgLoader::Free()
  123. {
  124. if(m_pImage)
  125. {
  126. delete []m_pImage;
  127. m_pImage = NULL;
  128. }
  129. }
时间: 2024-12-29 05:29:54

WINCE下使用OPENGL(2)的相关文章

WinCE下使用C#获得带毫秒的DateTime.Now

在WinCE下,使用DateTime.Now获取的系统时间是不带毫秒的,如果想要它带毫秒,需要耍点手段.话不多说,直接上代码: public static DateTimePrecisely { //定义一个全局变量,用来保存一个毫秒的0点. private static int m_offset = 0; static DateTimePrecisely() { int s = DateTime.Now.Second; //我们需要等待一次跨秒,来定义毫秒的0点. while (true) {

WinCE下GPRS自动拨号软件(GPRS AutoDial)

之前在WinCE下调试USB的3G Modem时,写过一个拨号助手RASManager,基本能用.后来车机卖到俄罗斯去,客户老M提供了一个更好的GPRS自动拨号软件GPRS AutoDial,功能完善且强大,RASManager基本就废弃了. GPRS AutoDial的使用方法如下图所示. GPRS AutoDial v1.4.3下载地址,http://files.cnblogs.com/files/we-hjb/GPRS_AD_1.4.3.rar

Wince下sqlce数据库开发(二)

上次写到使用数据绑定的方法测试本地sqlce数据库,这次使用访问SQL Server的方法访问sqlce,你会发现他们是如此的相似... 参考资料:http://www.cnblogs.com/rainman/archive/2012/03/13/2393975.html 本文的最后附有本次测试的全部代码,大家可以去下载.当然,我更希望这里作为一个交流的平台,能够相互的学习,如果你们有其他的想法希望可以告诉我 注:开发环境VS2008       开发语言:C# 1.创建Wince下的Winfo

Wince下sqlce数据库开发(一)

对于Wince下的sqlce数据库虽然很多人在用,但在我查找资料时,却发现资料是多么的匮乏,在此对自己这几天的了解做个简单介绍,希望对大家能有所帮助! 本文的最后附有所使用到的sqlce在wince下的安装文件,wince截屏工具及本示例代码的下载地址. 1.创建wince项目: 注:wince项目的创建需要在VS2008或者VS2005下 图1 创建“智能设备项目” 2.制作主界面 为主界面添加两个控件,分别为:datagrid和button,分别用于数据显示和功能控制. 图2 制作主界面 3

CentOS6.2 下安装OpenGL开发库

在Linux下做Qt开发,结果运行程序的时候提示找不到GL/gl.h文件,所以只能先把OpenGL库安装上去,不知道这样操作对不对,以后再考虑吧,下面开始安装 1.查看mesa相关的包 yum list mesa* 2.安装这些包 yum install mesa* 安装完成后,我们就拥有了一个基础的OpenGL开发环境了,但是仅仅有基础的开发环境是不够的,一般来讲,我们还要安装一个叫做Glut的库,这是一个OpenGL的辅助库,可以让我们创建与平台无关的OpenGL窗口.因此,安装Glut也是

如何生成一个 WinCE 下文件全路径大于 MAX_PATH(260) 字节的文件路径?

大家都知道,在 Windows 系统中文件名的路径最大值是 MAX_PATH.例如:Windows XP 系统,对文件名的长度进行测试: (1) 在分区 E:\ 的根目录新建一个文件,其文件名最大长度为: 255.---全路径长度>>> 258(2) 在分区 E:\ 子目录 Program Files\ 中新建一个文件,其文件名的最大长度为: 242. ---全路径长度>>>259在 WinCE 系统下,也有一定的限制.另外,如果试图将在 E:\ 根目录新建的最大文件名

Wince下演示系统自启动/加载dll方法

前面我们已经介绍过了Wince开机画面,自启动方法了. 今天主要是介绍我们演示系统是如何实现的自运行和加载Dll的方法. 之前我们碰到的主要问题是这样的: 1.在catalog items下加载 Sotorage Devices--MSFLash- Drivers--Flash MDD. 这样,Wince下就可以看到NandFlash的盘符,并且修改注册表/校准鼠标后都可以保存下来. 但是,此时是不能用飞凌提供的程序自启动的,且dll也无法自动加载. 2.在catalog items下不加载 S

(Win8.1)VS2013环境下配置OpenGL

一.配置OpenGL 1.首先,下载glut.rar文件,这个网上搜一下都能够找到,亦可以从opengl官网下载,点击打开链接. 2.解压后可以得到5个文件:glut.h.glut.dll.glut.lib.glut32.lib.glut32.dll.然后, (1)把glut.h文件放在C:\ProgramFiles\Microsoft SDKs\Windows\v7.0A\Include\gl文件夹下面: 网上的教程说是放在该目录下,但是v7.0好像根本就没有Include更别说子目录了,但是

WINCE下进程间通信(一)

WINCE下进程间通信(一) 在WINCE开发中经常需要在不同的进程之间传递.共享数据,总结了一下,WINCE下进程间通信常用的方式有:Windows消息,共享内存,socket通信,管道,全局原子,邮槽等,下面就分别对这几种方法做个小结.(当然还可以采用注册表,磁盘文件以及数据库方式,只是这几种方式的通信效率和实时性比较低,所以一般不考虑.) 一.Windows消息 通过Windows消息,可以很方便的在进程与进程之间传递数据.对于传递像字符串这种小的数据,可以直接将字符串以消息参数wPara