VC从文件中加载图片
用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从文件中加载图片相关推荐
- silverlight beet - 从xap文件中加载图片
xaml写法: <Image x:Name="xImage" Stretch="Uniform" Source="/pic;component ...
- Web前端笔记-js中加载图片文件(vue cli中同样适用)
这里主要是在vue cli项目中加载图片的时候会出现304,特别是使用自己写的js加载图片的时候,此博文记录了解决办法. 在js文件中引用文件 import img from '@/assets/im ...
- [WM C++]从资源文件中加载显示png/jpg图片
一. 实现代码 void DrawImage(HDC hdc,RECT& rc,UINT nIDResource,CString lpType) { HINSTANCE hInst = ...
- Windows编程 内存中加载图片并显示 Direct离屏表面的实现
版本:VS2015 语言:C++ 前段时间去白空轨了,感觉快燃尽了.没有看Windows的书,所以博客也没更,不过请组织放心,从现在开始,即使是节假日,我也会仔细钻研DirectX的. 今天是第七章的 ...
- 《R数据可视化手册》一1.4 从Excel文件中加载数据
本节书摘来自异步社区<R数据可视化手册>一书中的第1章,第1.4节,作者 [美]Winston Chang,更多章节内容可以访问云栖社区"异步社区"公众号查看 1.4 ...
- java 中加载图片
初学java在网上找了好多关于在applet中加载图片的程序,感觉比较多而乱,下面是个简单的示例: import java.awt.Frame; import java.applet.*; imp ...
- Vue项目中加载图片的坑
Vue项目中加载图片时,遇到的坑 1.当直接在标签中,使用图片路径,此时可以正常显示. <img src='img_src' /> 正常显示 2.当img标签的src属性为变量时,且该变量 ...
- native react 图片多选_React Native中加载图片的各种姿势
初使用Image,由于在React Native中图片资源来源丰富,刚开始我也是一脸懵逼,在几番尝试以后,终于了然 加载项目目录图片 在项目目录中新建一个Directory,命名img,拷贝一张名为' ...
- picturectrl控件中加载图片并显示_在 CRA 中使用 webp 图片提升加载性能
webp 是 google 提倡的一种新的 image 格式,意在为 web 提供体积更小的图片格式.通常情况下,无损压缩可以减小 25%-35% 的体积(有例外情况,反而会增大体积,但是是因为转换图 ...
最新文章
- 用PhpStorm IDE创建GG App Engine PHP应用教程
- /usr/bin/ld: cannot find -lc错误原因及解决方法
- java12/6作业1
- mysql 存储过程 排序_mysql存储过程排序
- 设计模式(七)装饰模式
- 源码:Hadoop-2.7.4 启动过程中执行start-all.sh开始
- 禁用 ssh agent_如何修复“禁用Agent XP”错误
- emmap erlang_erLang学些笔记2—基本类型
- 正则匹配图片地址 php,php正则匹配图片地址
- jedate日期插件使用
- Chrome扩展 - 百度识图
- 如何制作微信抖音小游戏
- 判断多边形边界曲线顺/逆时针 两种方法
- 苹果软件测试的电池损耗准确,电池不耐用?教你如何检测iPhone电池损耗!
- Gaussian Process understanding
- Oracle创建HR示例模式
- VC/MFC 从WebBrower 中获取 HTML 和文本
- Abase2:字节跳动新一代高可用 NoSQL 数据库
- 轻量级工作流引擎snaker 2.0.0
- 二维火:智能餐饮云端互联是如何实现的?
热门文章
- 小红书增长负责人:精确化营销如何玩
- MySQL性能突发事件问题排查技巧
- 快看过来,傻瓜都能理解的 Netty 模型架构
- c语言作业皇帝的许诺,C语言函数大全(s开头) (1)/继
- cvid matlab,WAKE-WIN10-SOFT-软件-Matlab配置及工具箱
- php和mysql的版本区别_MySQL各个版本区别_MySQL
- mysql查询语句判断日期_mysql语句查询时间检测
- linux环境内核调试软件,Linux内核调试环境的搭建(使用qemu)
- 蓝牙a2dp硬件卸载是什么意思_索尼这项音频黑科技 让蓝牙音质从此不输有线
- 【Castell】安全联锁提升UPS设备维护管理水平