用MFC做GDI开发的朋友肯定熟悉CBitmap类,该类封装了HBITMAP对象,简化了关于HBITMAP的API操作,如LoadBitmap方法可直接加载资源中指定ID的图片,但是很多情况下我们需要从文件中加载图片,CBitmap类就没有提供这样的方法了。

下面我总结几种我知道的从文件加载图片的方法:

1.使用API函数LoadImage,指定LR_LOADFROMFILE标志。如:

HBITMAP hBitmap = (HBITMAP) ::LoadImage(NULL, strPath, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE);

这种方式十分简洁,但是根据我的实验,此方法貌似只能加载bmp格式的图片,对于jpg/png等格式都加载不了,真是郁闷。

2.利用COM,我前段时间在CodeGuru淘到这个方法,我把代码整理了一下,如下所示:

HBITMAP LoadImageFromFile( PCTSTR pszBitmapFile )

{

IPicture* pIPic;

IStream* pStream = NULL;

HGLOBAL hGlobal;

void* pVoid;

FILE *fp = NULL;

fopen_s( &fp, CT2A( pszBitmapFile ),"rb" );

if ( fp == NULL )return NULL;

fseek( fp, 0, SEEK_END );

long lFS = ftell(fp);

fseek( fp, 0, SEEK_SET );

hGlobal = GlobalAlloc( GPTR, lFS );

if ( hGlobal == NULL)

{

fclose(fp);

return NULL;

}

pVoid = (void*)hGlobal;

fread( pVoid, 1, lFS, fp );

fclose( fp );

// Create an IStream so IPicture can

if( FAILED( CreateStreamOnHGlobal( hGlobal,FALSE,&pStream) ) )

{

GlobalFree(hGlobal);

return NULL;

}

HRESULT hr = OleLoadPicture( pStream, 0, TRUE, IID_IPicture, (void**)&pIPic);

pStream->Release();

GlobalFree(hGlobal);

if( FAILED(hr) )

{

return NULL;

}

HBITMAP hBitmap = NULL;

pIPic->get_Handle( ( unsigned int*)&hBitmap );

HBITMAP hBitmapRet = (HBITMAP)CopyImage( hBitmap, IMAGE_BITMAP, 0, 0,      LR_COPYRETURNORG );

pIPic->Release();

return hBitmapRet;

}

实验表明:这段代码可以加载JPG/GIF/BMP,对png格式加载不了。不能使用框架的朋友可以试试这段代码,不过要注意,由于使用了COM,记得使用之前要初始化COM。

3.第三种方式,也是我经常采取的方式,就是使用ATL和MFC的共享类Cimage。这个类十分强大,从它数千行的源码中就可以看出。然弱水三千,只取一瓢。用它从文件加载图片,只算牛刀小试。

CImage img;

img.Load( strPath );

if( !img.IsNull() )

{

HBITMAP hBitmap = img.Detach();

}

我实验过的图片都能加载,而且很快。使用别的框架的朋友可以去研究一下Cimage的源码,封装加载图片的功能,绝对比第二种使用COM加载的方法实用多了,也方便多了。

其他:理解HBITMAP结构的高手一般可以直接读取图片文件,分析数据流的。至于像我这样路过的人,不用搞那么复杂的了。

转载于:https://www.cnblogs.com/fangkm/archive/2009/03/31/1426543.html

VC从文件中加载图片相关推荐

  1. silverlight beet - 从xap文件中加载图片

    xaml写法: <Image x:Name="xImage" Stretch="Uniform"  Source="/pic;component ...

  2. Web前端笔记-js中加载图片文件(vue cli中同样适用)

    这里主要是在vue cli项目中加载图片的时候会出现304,特别是使用自己写的js加载图片的时候,此博文记录了解决办法. 在js文件中引用文件 import img from '@/assets/im ...

  3. [WM C++]从资源文件中加载显示png/jpg图片

    一. 实现代码 void DrawImage(HDC hdc,RECT& rc,UINT nIDResource,CString lpType) {     HINSTANCE hInst = ...

  4. Windows编程 内存中加载图片并显示 Direct离屏表面的实现

    版本:VS2015 语言:C++ 前段时间去白空轨了,感觉快燃尽了.没有看Windows的书,所以博客也没更,不过请组织放心,从现在开始,即使是节假日,我也会仔细钻研DirectX的. 今天是第七章的 ...

  5. 《R数据可视化手册》一1.4 从Excel文件中加载数据

    本节书摘来自异步社区<R数据可视化手册>一书中的第1章,第1.4节,作者 [美]Winston Chang,更多章节内容可以访问云栖社区"异步社区"公众号查看 1.4 ...

  6. java 中加载图片

    初学java在网上找了好多关于在applet中加载图片的程序,感觉比较多而乱,下面是个简单的示例: import java.awt.Frame;  import java.applet.*;  imp ...

  7. Vue项目中加载图片的坑

    Vue项目中加载图片时,遇到的坑 1.当直接在标签中,使用图片路径,此时可以正常显示. <img src='img_src' /> 正常显示 2.当img标签的src属性为变量时,且该变量 ...

  8. native react 图片多选_React Native中加载图片的各种姿势

    初使用Image,由于在React Native中图片资源来源丰富,刚开始我也是一脸懵逼,在几番尝试以后,终于了然 加载项目目录图片 在项目目录中新建一个Directory,命名img,拷贝一张名为' ...

  9. picturectrl控件中加载图片并显示_在 CRA 中使用 webp 图片提升加载性能

    webp 是 google 提倡的一种新的 image 格式,意在为 web 提供体积更小的图片格式.通常情况下,无损压缩可以减小 25%-35% 的体积(有例外情况,反而会增大体积,但是是因为转换图 ...

最新文章

  1. 用PhpStorm IDE创建GG App Engine PHP应用教程
  2. /usr/bin/ld: cannot find -lc错误原因及解决方法
  3. java12/6作业1
  4. mysql 存储过程 排序_mysql存储过程排序
  5. 设计模式(七)装饰模式
  6. 源码:Hadoop-2.7.4 启动过程中执行start-all.sh开始
  7. 禁用 ssh agent_如何修复“禁用Agent XP”错误
  8. emmap erlang_erLang学些笔记2—基本类型
  9. 正则匹配图片地址 php,php正则匹配图片地址
  10. jedate日期插件使用
  11. Chrome扩展 - 百度识图
  12. 如何制作微信抖音小游戏
  13. 判断多边形边界曲线顺/逆时针 两种方法
  14. 苹果软件测试的电池损耗准确,电池不耐用?教你如何检测iPhone电池损耗!
  15. Gaussian Process understanding
  16. Oracle创建HR示例模式
  17. VC/MFC 从WebBrower 中获取 HTML 和文本
  18. Abase2:字节跳动新一代高可用 NoSQL 数据库
  19. 轻量级工作流引擎snaker 2.0.0
  20. 二维火:智能餐饮云端互联是如何实现的?

热门文章

  1. 小红书增长负责人:精确化营销如何玩
  2. MySQL性能突发事件问题排查技巧
  3. 快看过来,傻瓜都能理解的 Netty 模型架构
  4. c语言作业皇帝的许诺,C语言函数大全(s开头) (1)/继
  5. cvid matlab,WAKE-WIN10-SOFT-软件-Matlab配置及工具箱
  6. php和mysql的版本区别_MySQL各个版本区别_MySQL
  7. mysql查询语句判断日期_mysql语句查询时间检测
  8. linux环境内核调试软件,Linux内核调试环境的搭建(使用qemu)
  9. 蓝牙a2dp硬件卸载是什么意思_索尼这项音频黑科技 让蓝牙音质从此不输有线
  10. 【Castell】安全联锁提升UPS设备维护管理水平