zoukankan      html  css  js  c++  java
  • VC下加载JPG/GIF/PNG图片的两种方法

    仅管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();
                        }
                }
        }

  • 相关阅读:
    POJ 3468 A Simple Problem with Integers
    BZOJ 4430 Guessing Camels
    POJ 2309 BST
    POJ 1990 MooFest
    cf 822B Crossword solving
    cf B. Black Square
    cf 828 A. Restaurant Tables
    Codefroces 822C Hacker, pack your bags!
    [HDU 2255] 奔小康赚大钱
    [BZOJ 1735] Muddy Fields
  • 原文地址:https://www.cnblogs.com/buffer/p/1410172.html
Copyright © 2011-2022 走看看