忘记从哪来收集过来的资料了,暂且不管是哪位老兄写的,只道一声谢谢。

仅管VC有提供相应的API和类来操作bmp位图、图标和(增强)元文件,但却不支持jpg、gif和png等格式的图片,而这几种格式却是常常要用到的。这里我给大家介绍两种办法来操作这些格式的图片。

1.用API OleLoadPicture来加载JPG、GIF格式的图片(注:不支持PNG格式,另外GIF只能加载第一帧,且不支持透明)

OleLoadPicture 函数实际上创建了一个IPicture类型的COM接口对象,然后我们可以通过这个COM接口来操作图片(实际上你也可以用API OleCreatePictureIndirect来加载图片,不过相比而言OleLoadPicture函数简化了基于流的IPicture对象的创 建),下面是示例代码:(注:由于只是用来示例,代码中省去了出错情况的处理)
     
    /* 
    *如下代码段实现的功能是从指定的路径中读取图片,并显示出来 
    */ 
    void DisplayImage(HDC hDC, LPCTSTR szImagePath) 
    { 
            HANDLE hFile=CreateFile(szImagePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); //从指定的路径szImagePath中读取文件句柄 
            DWORD dwFileSize=GetFileSize(hFile, NULL); //获得图片文件的大小,用来分配全局内存 
            HGLOBAL hImageMemory=GlobalAlloc(GMEM_MOVEABLE, dwFileSize); //给图片分配全局内存 
            void *pImageMemory=GlobalLock(hImageMemory); //锁定内存 
            DWORD dwReadedSize; //保存实际读取的文件大小 
            ReadFile(hFile, pImageMemory, dwFileSize, &dwReadedSize, NULL); //读取图片到全局内存当中 
            GlobalUnlock(hImageMemory); //解锁内存 
            CloseHandle(hFile); //关闭文件句柄 
     
            IStream *pIStream;//创建一个IStream接口指针,用来保存图片流 
            IPicture *pIPicture;//创建一个IPicture接口指针,表示图片对象 
            CreateStreamOnHGlobal(hImageMemory, false, &pIStream) //用全局内存初使化IStream接口指针 
            OleLoadPicture(pIStream, 0, false, IID_IPicture, (LPVOID*)&(pIPicture));//用OleLoadPicture获得IPicture接口指针 
     
            //得到IPicture COM接口对象后,你就可以进行获得图片信息、显示图片等操作 
            OLE_XSIZE_HIMETRIC hmWidth; 
            OLE_YSIZE_HIMETRIC hmHeight; 
            pIPicture->get_Width(&hmWidth); //用接口方法获得图片的宽和高 
            pIPicture->get_Height(&hmHeight); 
            pIPicture->Render(hDC,0,0,100,100,0,hmHeight,hmWidth,-hmHeight,NULL); //在指定的DC上绘出图片 
     
            GlobalFree(hImageMemory); //释放全局内存 
            pIStream->Release(); //释放pIStream 
            pIPicture->Release(); //释放pIPicture 
    }

2.利用第三方的开发库来操作图片

这 里我向大家推荐一个库CxImage。 CxImage里面包含了许多的类,可以用来加载、保存、显示和变换图片,而且支持许多的图片格式,包括BMP、 JPEG、 GIF、 PNG、 TIFF、 MNG、 ICO、 PCX、 TGA、 WMF、 WBMP、 JBG、 J2K等。另外CxImage也支持Alpha通道,动画帧等许多功能,而且它还是开源免费的。CxImage的当前的版本是v6.00, 介绍和下载可以访问:http://www.codeproject.com/KB/graphics/cximage.aspx。CxImage的用法十分简单,示例如下(省去出错处理):
     
    void DisplayImage(HDC hDC, CString fileName) 
    { 
            CString fileExt; //图片的扩展名 
            int len = fileName.GetLength(); 
            for(int i=len-1; i>=0; i--) //得到图片的扩展名 
            { 
                    if(fileName[ i ] == '.') 
                    { 
                            fileExt=fileName.Mid(i+1); 
                            break; 
                    } 
            } 
            fileExt.MakeLower(); //将扩展名转为小写 
            if(fileExt != _T("")) 
            { 
                    //创建CxImage对象,其中静态方法CxImage::GetTypeIdFromName用来根据扩展名获得图片格式的ID代表 
                    CxImage image(fileName,CxImage::GetTypeIdFromName(fileExt)); 
                    if(image.IsValid()) 
                    { 
                            image.Draw(hDC); 
                            image.Destroy(); 
                    } 
            } 
    }

3 提供一中更简单的方法

VC MFC 提供的 API LoadBitmap / LoadImage 类 CBitmap 等都只能操作 BMP 位图,图标。对于其他常用的 JPG / JPEG / GIF / PNG 格式,它无能为力。VC 下怎样才能加载各种非 BMP 格式的图片呢? 下面介绍一种最简单的办法。用 CImage 类的 Load 函数加载图片,之后用 Detach 取得 HBITMAP 句柄。取得图片的HBITMAP 句柄后就可以像操作 BMP 图片一样处理 JPG / JPEG / GIF / PNG 格式的图片了。具体代码如下:

#include “atlimage.h”

CImage img;

HRESULT ret = img.Load(filename ); // filename 是要加载的文件名(包含路径)

HBITMAP hBitmap = img.Detach();

//像操作 BMP 图片一样处理图片 ,例如:显示图片

CBitmap cBitmap;
CClientDC* pDC = new CClientDC(this);
BITMAP bitmap;
CDC memdc;
cBitmap.Attach(hBitmap);
memdc.CreateCompatibleDC(pDC);
memdc.SelectObject(hBitmap);
cBitmap.GetBitmap(&bitmap);

pDC->StretchBlt(0, 0, bitmap.bmWidth, bitmap.bmHeight, &memdc, 0, 0, bitmap.bmWidth, bitmap.bmHeight, SRCCOPY);

转载:http://www.360doc.com/content/13/1210/16/9970815_336110174.shtml#

http://blog.csdn.net/chence19871/article/details/47108943

VC操作Image的三种方法(收集)的更多相关文章

  1. AHS日志收集的三种方法

    硬件环境:(描述实验机器初始环境) 型号 DL380 G8 序列号   配置扩展   备注   软件环境: □  操作系统:无 连接方式: □  无 实验步骤: 1在ILO里点information点 ...

  2. mfc 在VC的两个对话框类中传递参数的三种方法

    弄了好久,今天终于把在VC中的对话框类之间传递参数的问题解决了,很开心,记录如下: 1. 我所建立的工程是一个基于MFC对话框的应用程序,一共有三个对话框,第一个对话框为主对话框,所对应的类为CTMD ...

  3. VC中加载LIB库文件的三种方法

    VC中加载LIB库文件的三种方法 在VC中加载LIB文件的三种方法如下: 方法1:LIB文件直接加入到工程文件列表中   在VC中打开File View一页,选中工程名,单击鼠标右键,然后选中&quo ...

  4. PHP实现链式操作的三种方法详解

    这篇文章主要介绍了PHP实现链式操作的三种方法,结合实例形式分析了php链式操作的相关实现技巧与使用注意事项,需要的朋友可以参考下 本文实例讲述了PHP实现链式操作的三种方法.分享给大家供大家参考,具 ...

  5. python更新数据库脚本三种方法

    最近项目的两次版本迭代中,根据业务需求的变化,需要对数据库进行更新,两次分别使用了不同的方式进行更新. 第一种:使用python的MySQLdb模块利用原生的sql语句进行更新 import MySQ ...

  6. 痞子衡嵌入式:在IAR开发环境下将关键函数重定向到RAM中执行的三种方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在IAR开发环境下将关键函数重定向到RAM中执行的三种方法. 嵌入式项目里应用程序代码正常是放在 Flash 中执行的,但有时候也需要将 ...

  7. JAVA之线程同步的三种方法

    最近接触到一个图片加载的项目,其中有声明到的线程池等资源需要在系统中线程共享,所以就去研究了一下线程同步的知识,总结了三种常用的线程同步的方法,特来与大家分享一下.这三种方法分别是:synchroni ...

  8. VC++获取IDC_EDIT的7种方法

    VC++获取IDC_EDIT的7种方法 http://blog.csdn.net/baizengfei/article/details/7997618 //第一种方法 int number1, num ...

  9. mysql分表的三种方法

    先说一下为什么要分表当一张的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了.分表的目的就在于此,减小数据库的负担,缩短查询时间.根据个人经验,mysql执行一 ...

随机推荐

  1. 是一个IPV6地址

    每次在VS上调试,发现本机地址是 ::1 这种就不解.由于太忙而没关注,今天看了IPV6的文章才明白.原来这是个IPV6地址,也就是本机环回地址.以前是127.0.0.1,IPV4版本,而IPV6的就 ...

  2. ORACLE 绑定变量用法总结 .

    之前对ORACLE中的变量一直没个太清楚的认识,比如说使用:.&.&&.DEIFINE.VARIABLE……等等.今天正好闲下来,上网搜了搜相关的文章,汇总了一下,贴在这里,方 ...

  3. 深入浅出畅谈Zigbee

    ZigBee采用802.15.4标准作为其对等通信的基础.该标准由ZigBee联盟(ZigBee Alliance)开发并管理.ZigBee Alliance是一家投资于该标准并在无线领域进行推广的联 ...

  4. delphi 操作 TWebBrowser 实现自动填表(JQuery脚本与 OleVariant 方法)

    版本:DELPHI XE8 操作交通银行信用卡申请表单(2016-03-23),网址如下: https://creditcardapp.bankcomm.com/applynew/front/appl ...

  5. 解决C/C++程序执行一闪而过的方法(三种办法)

    简述 在VS编写控制台程序的时候,包括使用其他IDE(Visual C++)编写C/C++程序,经常会看到程序的执行结果一闪而过,要解决这个问题,可以在代码的最后加上system(“pause”).g ...

  6. registered the JBDC driver [oracle.jdbc.OracleDriver] but failed to unregister it when the web application was stopped. (转)

    最近项目中遇见一问题,在开发环境没有问题的代码,到了生产环境就会报如下错误:   严重: A web application registered the JBDC driver [oracle.jd ...

  7. 快速配置 Samba 将 Linux 目录映射为 Windows 驱动器

    原文链接 samba client ubuntu redhat ubuntu gui tools 1,列出某个IP地址所提供的共享文件夹 smbclient -L 198.168.0.1   2,在s ...

  8. cf467A George and Accommodation

    A. George and Accommodation time limit per test 1 second memory limit per test 256 megabytes input s ...

  9. UVA - 11020 Efficient Solutions(Multiset)

    本题利用multiset解决.根据题意,如果我们用P(x,y)表示一个人,因为人可以相同,所以用multiset.我们会发现,如果所有人群都是有优势的,那么这些点呈现一个递减的趋势.如果刚刚插入一个人 ...

  10. 开发SCM系统笔记001

    使用EasyUI分页问题: 1.在分页界面没有显示声明分页属性名称,系统如何获取? EasyUI会向后台发送page\rows两个参数. 2.在配置sql参数时,parametertype与param ...