CxImage动态加载图片(判断图片文件类型)-阿里云开发者社区

开发者社区> double2li> 正文

CxImage动态加载图片(判断图片文件类型)

简介: 1、打开一张图可以通过创建一个新的CxImage对象来完成,通过构造函数来打开一张图CxImage::CxImage(const char * filename, DWORD imagetype)其中filename是需要打开的文件路径,imagetype是文件类型,支持的类型有: [c...
+关注继续查看

1、打开一张图
可以通过创建一个新的CxImage对象来完成,通过构造函数来打开一张图
CxImage::CxImage(const char * filename, DWORD imagetype)
其中filename是需要打开的文件路径,imagetype是文件类型,支持的类型有:

[cpp] view plain copy
 
  1. CXIMAGE_FORMAT_UNKNOWN,  
  2. CXIMAGE_FORMAT_BMP,  
  3. CXIMAGE_FORMAT_GIF,  
  4. CXIMAGE_FORMAT_JPG,  
  5. CXIMAGE_FORMAT_PNG,  
  6. CXIMAGE_FORMAT_MNG,  
  7. CXIMAGE_FORMAT_ICO,  
  8. CXIMAGE_FORMAT_TIF,  
  9. CXIMAGE_FORMAT_TGA,  
  10. CXIMAGE_FORMAT_PCX,  
  11. CXIMAGE_FORMAT_WBMP,  
  12. CXIMAGE_FORMAT_WMF,  
  13. CXIMAGE_FORMAT_J2K,  
  14. CXIMAGE_FORMAT_JBG,  
  15. CXIMAGE_FORMAT_JP2,  
  16. CXIMAGE_FORMAT_JPC,  
  17. CXIMAGE_FORMAT_PGX,  
  18. CXIMAGE_FORMAT_PNM,  
  19. CXIMAGE_FORMAT_RAS,  


当然,这么多格式很难记住,我们可以通过如下函数来直接获得文件的格式

[cpp] view plain copy
 
  1. int FindType(const CString& filename)  
  2. {  
  3. CString ext = filename.Right(filename.GetLength()-filename.ReverseFind('.')-1);  
  4. int type = 0;  
  5. if (ext == "bmp") type = CXIMAGE_FORMAT_BMP;  
  6. #if CXIMAGE_SUPPORT_JPG  
  7. else if (ext=="jpg"||ext=="jpeg") type = CXIMAGE_FORMAT_JPG;  
  8. #endif  
  9. #if CXIMAGE_SUPPORT_GIF  
  10. else if (ext == "gif") type = CXIMAGE_FORMAT_GIF;  
  11. #endif  
  12. #if CXIMAGE_SUPPORT_PNG  
  13. else if (ext == "png") type = CXIMAGE_FORMAT_PNG;  
  14. #endif  
  15. #if CXIMAGE_SUPPORT_MNG  
  16. else if (ext=="mng"||ext=="jng") type = CXIMAGE_FORMAT_MNG;  
  17. #endif  
  18. #if CXIMAGE_SUPPORT_ICO  
  19. else if (ext == "ico") type = CXIMAGE_FORMAT_ICO;  
  20. #endif  
  21. #if CXIMAGE_SUPPORT_TIF  
  22. else if (ext=="tiff"||ext=="tif") type = CXIMAGE_FORMAT_TIF;  
  23. #endif  
  24. #if CXIMAGE_SUPPORT_TGA  
  25. else if (ext=="tga") type = CXIMAGE_FORMAT_TGA;  
  26. #endif  
  27. #if CXIMAGE_SUPPORT_PCX  
  28. else if (ext=="pcx") type = CXIMAGE_FORMAT_PCX;  
  29. #endif  
  30. #if CXIMAGE_SUPPORT_WBMP  
  31. else if (ext=="wbmp") type = CXIMAGE_FORMAT_WBMP;  
  32. #endif  
  33. #if CXIMAGE_SUPPORT_WMF  
  34. else if (ext=="wmf"||ext=="emf") type = CXIMAGE_FORMAT_WMF;  
  35. #endif  
  36. #if CXIMAGE_SUPPORT_J2K  
  37. else if (ext=="j2k"||ext=="jp2") type = CXIMAGE_FORMAT_J2K;  
  38. #endif  
  39. #if CXIMAGE_SUPPORT_JBG  
  40. else if (ext=="jbg") type = CXIMAGE_FORMAT_JBG;  
  41. #endif  
  42. #if CXIMAGE_SUPPORT_JP2  
  43. else if (ext=="jp2"||ext=="j2k") type = CXIMAGE_FORMAT_JP2;  
  44. #endif  
  45. #if CXIMAGE_SUPPORT_JPC  
  46. else if (ext=="jpc"||ext=="j2c") type = CXIMAGE_FORMAT_JPC;  
  47. #endif  
  48. #if CXIMAGE_SUPPORT_PGX  
  49. else if (ext=="pgx") type = CXIMAGE_FORMAT_PGX;  
  50. #endif  
  51. #if CXIMAGE_SUPPORT_RAS  
  52. else if (ext=="ras") type = CXIMAGE_FORMAT_RAS;  
  53. #endif  
  54. #if CXIMAGE_SUPPORT_PNM  
  55. else if (ext=="pnm"||ext=="pgm"||ext=="ppm") type = CXIMAGE_FORMAT_PNM;  
  56. #endif  
  57. else type = CXIMAGE_FORMAT_UNKNOWN;  
  58.   
  59. return type;  
  60. }  


具体实例打开一幅图片:

[cpp] view plain copy
 
  1. void CProDlg::OnBnClickedButton3()  
  2. {  
  3. CString strPicPath;  
  4. CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T("图片文件(*.jpg;*.jpeg;*.gif;,*.bmp)|*.jpg;*.jpeg;*.gif;*.bmp|位图文件(*.BMP)|*.BMP||"));  
  5. dlg.m_ofn.lpstrInitialDir=_T(".//");  
  6. if(IDOK==dlg.DoModal())  
  7. {strPicPath.Format(_T("%s"),dlg.GetPathName());}  
  8. CString fileExt;  
  9. int len=strPicPath.GetLength();  
  10. for(int i=len-1;i>=0;i--)  
  11. {if(strPicPath[i]=='.'){fileExt=strPicPath.Mid(i+1);break;}}  
  12. fileExt.MakeLower();  
  13. int type;  
  14. if(fileExt!=_T(""))  
  15. {type=FindType(strPicPath);}  
  16. CxImage image;  
  17. image.Load(strPicPath,type);  
  18. //将整个控件调整为与图像同一尺寸  
  19. GetDlgItem(IDC_PIC1)->SetWindowPos(NULL,0,0,300,300,SWP_NOMOVE);  
  20. CRect zcRect;  
  21. GetDlgItem(IDC_PIC1)->GetClientRect(&zcRect);  
  22. CDC *pDC=GetDlgItem(IDC_PIC1)->GetDC();  
  23. image.Draw(pDC->m_hDC,zcRect.left,zcRect.top,300,300);  
  24.   
  25. }  


2、保存一张图

[cpp] view plain copy
 
  1. bool CxImage::Save(LPCWSTR filename, DWORD imagetype=0)  


参数和上面是一样的。

具体实例;

[cpp] view plain copy
 
  1. void CProDlg::OnBnClickedButton1()  
  2. float scale=0.5;  
  3. CxImage image,smallImg;  
  4. CString fileName="d://1.jpg";  
  5. CString fileExt;  
  6. int len=fileName.GetLength();  
  7. for(int i=len-1;i>=0;i--)  
  8. {if(fileName[i]=='.'){fileExt=fileName.Mid(i+1);break;}}  
  9. fileExt.MakeLower();  
  10. int type;  
  11. if(fileExt!=_T(""))  
  12. {type=CxImage::GetTypeIdFromName(fileExt);}  
  13. image.Load(fileName);  
  14. image.Resample(image.GetWidth()*scale,image.GetHeight()*scale,1,&smallImg);  
  15. smallImg.Save("d://2.jpg",type);  
  16. }  




3、得到图形数据,以便在OpenGL中使用材质

[cpp] view plain copy
 
  1. BYTE* CxImage::GetBits(DWORD row = 0);  


4、得到图形大小

[cpp] view plain copy
 
  1. long GetSize();  


5、得到图形高度和宽度

[cpp] view plain copy
 
  1. DWORD CxImage::GetHeight();  
  2. DWORD CxImage::GetWidth();  


6、得到文件类型

[cpp] view plain copy
 
  1. DWORD CxImage::GetType() const;  


7、得到最后一个错误

[cpp] view plain copy
 
  1. char* CxImage::GetLastError();  


8、在界面中绘制出来

[cpp] view plain copy
 
  1. long CxImage::Draw(HDC hdc, const RECT& rect, RECT* pClipRect=NULL)  


HDC 绘图设备,rect 绘图的区域,确定绘图的左上角和右下角坐标。pClipRect,裁剪区域,一般可以和绘图区域一样大小,除非特殊需要。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Java 性能优化:35个小细节,让你提升Java代码运行的效率
  代码优化,一个很重要的课题。可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用,但是,吃的小虾米一多之后,鲸鱼就被喂饱了。   代码优化也是一样,如果项目着眼于尽快无BUG上线,那么此时可以抓大放小,代码的细节可以不精打细磨;但是如果有足够的时间开发、维护代码,这时候就必须考虑每个可以优化的细节了,一个一个细小的优化点累积起来,对于代码的运行效率绝对是有提升的。
9 0
北航与第四范式团队KDD Cup RL Track冠军方案:解密共享出行场景中的优化问题
作者:罗远飞 近日,全球顶级数据挖掘竞赛 KDD Cup 2020 已经正式画上圆满句号,KDD Cup 2020 RL Track 比赛结果也随之出炉,北京航空航天大学软件开发环境国家重点实验室童咏昕教授研究组与第四范式罗远飞组成的联合团队脱颖而出,斩获 KDD Cup 2020 强化学习挑战赛冠军。
8 0
使用Recast.AI创建具有人工智能的聊天机器人
使用Recast.AI创建具有人工智能的聊天机器人
6 0
SAP Netweaver的负载均衡消息服务器 vs CloudFoundry的App Router
SAP Netweaver的负载均衡消息服务器 vs CloudFoundry的App Router
4 0
有关AVL树的总结与感悟
一开始以为很复杂很可怕,后来自己想了一下其实也没那么可怕,无非就是左右子树的顺序调换而已。 有关AVL的旋转的原理就不再说明,不懂自行百度查书了解旋转原理。
4 0
NLP三大特征提取器全梳理:RNN vs CNN vs Transformer
在进行 NLP 模型训练前,请先选择一个好的特征提取器。
3 0
首家强化学习大规模落地工业应用,快手是如何做到的?
快手的日活跃用户数量超过三亿,其背后是业界领先的人工智能技术。
4 0
SAP成都研究院安德鲁:自己动手开发一个Chrome Extension
SAP成都研究院安德鲁:自己动手开发一个Chrome Extension
5 0
暑假实习面试总结——Go语言|Golang
目录 前景 一面HR 二面技术面 终面 总结
5 0
+关注
double2li
一个在IT行业摸爬滚打的老司机
2870
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载