利用COM组件IPicture读取jpg、gif、bmp图片文件数据和显示图片

1.读取图片数据

函数原型:bool LoadImage(const char *pName, unsigned char *pBitData);

函数功能,读取pName指向的图片文件的位图数据

bool LoadImage(const char *pName, unsigned char *pBitData) 

    HDC     hdcTemp; // DC用来保存位图 
    HBITMAP     hbmpTemp; // 保存临时位图 
    IPicture    *pPicture; // 定义IPicture Interface 
    OLECHAR     wszPath[MAX_PATH+1]; // 图片的完全路径 
    char        szPath[MAX_PATH+1]; // 图片的完全路径 
    long        lWidth; // 图像宽度 
    long        lHeight; // 图像高度 
    long        lWidthPixels; // 图像的宽带(以像素为单位) 
    long        lHeightPixels; // 图像的高带(以像素为单位) 
    GLint       glMaxTexDim ; // 保存纹理的最大尺寸 
  
    if (strstr(pName, "http://"))   // 如果路径包含 http:// 则… 
    { 
        strcpy(szPath, pName);  // 把路径拷贝到 szPath 
    } 
    else    // 否则从文件导入图片 
    { 
        GetCurrentDirectory(MAX_PATH, szPath);  // 取得当前路径 
        strcat(szPath, "\\");           // 添加字符"\" 
        strcat(szPath, pName);          // 添加图片的相对路径 
    } 
  
    MultiByteToWideChar(CP_ACP, 0, szPath, -1, wszPath, MAX_PATH);  // 把ASCII码转化为Unicode标准码 
    HRESULT hr = OleLoadPicturePath(wszPath, 0, 0, 0, IID_IPicture, (void**)&pPicture); 
  
    if(FAILED(hr))  // 如果导入失败 
    { 
        // 图片载入失败出错信息 
        MessageBox (HWND_DESKTOP, "图片导入失败!\n(TextureLoad Failed!)", "Error", MB_OK | MB_ICONEXCLAMATION); 
        return FALSE;   // 返回 FALSE 
    } 
  
    hdcTemp = CreateCompatibleDC(GetDC(0)); // 建立窗口设备描述表 
    if(!hdcTemp)    // 建立失败? 
    { 
        pPicture->Release(); // 释放IPicture 
        // 图片载入失败出错信息 
        MessageBox (HWND_DESKTOP, "图片导入失败!\n(TextureLoad Failed!)", "Error", MB_OK | MB_ICONEXCLAMATION); 
        return FALSE;       // 返回 FALSE 
    } 
  
    glGetIntegerv(GL_MAX_TEXTURE_SIZE, &glMaxTexDim);   // 取得支持的纹理最大尺寸 
    pPicture->get_Width(&lWidth);    // 取得IPicture 宽度 (转换为Pixels格式) 
    lWidthPixels = MulDiv(lWidth, GetDeviceCaps(hdcTemp, LOGPIXELSX), 2540); 
    pPicture->get_Height(&lHeight);  // 取得IPicture 高度 (转换为Pixels格式) 
    lHeightPixels = MulDiv(lHeight, GetDeviceCaps(hdcTemp, LOGPIXELSY), 2540); 
  
    // 调整图片到最好的效果 
    if (lWidthPixels <= glMaxTexDim) // 图片宽度是否超过显卡最大支持尺寸 
        lWidthPixels = 1 << (int)floor((log((double)lWidthPixels)/log(2.0f)) + 0.5f); 
    else    // 否则,将图片宽度设为显卡最大支持尺寸 
        lWidthPixels = glMaxTexDim; 
    if (lHeightPixels <= glMaxTexDim)    // 图片高度是否超过显卡最大支持尺寸 
        lHeightPixels = 1 << (int)floor((log((double)lHeightPixels)/log(2.0f)) + 0.5f); 
    else    // 否则,将图片高度设为显卡最大支持尺寸 
        lHeightPixels = glMaxTexDim; // 建立一个临时位图 
    BITMAPINFO  bi = {0};     // 位图的类型 
    DWORD       *pBits = 0; // 指向位图Bits的指针 
  
    bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); // 设置结构大小 
    bi.bmiHeader.biBitCount = 32;                // 32 位 
    bi.bmiHeader.biWidth    = lWidthPixels; // 宽度像素值 
    bi.bmiHeader.biHeight   = lHeightPixels;    // 高度像素值 
    bi.bmiHeader.biCompression  = BI_RGB;            // RGB 格式 
    bi.bmiHeader.biPlanes   = 1;                    // 一个位平面 
  
    // 建立一个位图这样我们可以指定颜色和深度 并访问每位的值 
    hbmpTemp = CreateDIBSection(hdcTemp, &bi, DIB_RGB_COLORS, (void**)&pBits, 0, 0); 
  
    if(!hbmpTemp)   // 建立失败? 
    { 
        DeleteDC(hdcTemp);   // 删除设备描述表 
        pPicture->Release();   // 释放IPicture 
        // 图片载入失败出错信息 
        MessageBox (HWND_DESKTOP, "图片导入失败!\n(TextureLoad Failed!)", "Error", MB_OK | MB_ICONEXCLAMATION); 
        return FALSE;   // 返回 FALSE 
    }   
    SelectObject(hdcTemp, hbmpTemp); //选择临时DC句柄和临时位图对象 
  
    // 在位图上绘制IPicture 
    pPicture->Render(hdcTemp, 0, 0, lWidthPixels, lHeightPixels, 0, lHeight, lWidth, -lHeight, 0); 
  
    // 将BGR转换为RGB 将ALPHA值设为255 
    width = lWidthPixels; height = lHeightPixels; 
    pBitData = new unsigned char[lWidthPixels * lHeightPixels * 4]; 
                // 循环遍历所有的像素 
    for(long i = 0; i < lWidthPixels * lHeightPixels; i++)   
    { 
        BYTE* pPixel      = (BYTE*)(&pBits[i]);  // 获取当前像素 
        pBitData[i*4]     = pPixel[2]; 
        pBitData[i*4+1] = pPixel[1]; 
        pBitData[i*4+2] = pPixel[0]; 
        pBitData[i*4+3] = 255; 
    } 
    DeleteObject(hbmpTemp); // 删除对象 
    DeleteDC(hdcTemp);  // 删除设备描述表 
    pPicture->Release(); // 释放 IPicture 
    return true;        // 返回 TRUE 

2.显示图片

函数原型:HRESULT ShowPicture(CString lpImageFile, HWND hWnd, int nScrWidth, int nScrHeight)

函数功能,读取lpImageFile指向的图片文件,并且显示以nScrWidth*nScrHeight显示在hWnd中

HRESULT ShowPicture(CString lpImageFile, HWND hWnd, int nScrWidth, int nScrHeight)

    HDC hDC_Temp=::GetDC(hWnd); 
    IPicture *pPic; 
    IStream *pStm; 
    BOOL bResult; 
    HANDLE hFile=NULL; 
    DWORD dwFileSize,dwByteRead; 
    //打开硬盘中的图形文件 
    hFile=CreateFile(lpImageFile,GENERIC_READ, 
        FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); 
    if (hFile!=INVALID_HANDLE_VALUE) 
    { 
        dwFileSize=GetFileSize(hFile,NULL);//获取文件字节数 
        if (dwFileSize==0xFFFFFFFF) 
            return E_FAIL; 
    } 
    else 
    { 
        return E_FAIL; 
    } 
    //分配全局存储空间 
    HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize); 
    LPVOID pvData = NULL; 
    if (hGlobal == NULL) 
    { 
        AfxMessageBox(_T("图片分配内存出错!")); 
        return E_FAIL; 
    } 
    if ((pvData = GlobalLock(hGlobal)) == NULL)//锁定分配内存块 
    { 
        AfxMessageBox(_T("内存块锁定出问题!")); 
        return E_FAIL; 
    } 
    ReadFile(hFile, pvData, dwFileSize, &dwByteRead, NULL);//把文件读入内存缓冲区 
    GlobalUnlock(hGlobal); 
    if(CreateStreamOnHGlobal(hGlobal, TRUE, &pStm) != S_OK) 
    { 
        AfxMessageBox(_T("流初始化失败!")); 
        return E_FAIL; 
    } 
    //装入图形文件 
    bResult=OleLoadPicture(pStm,dwFileSize,TRUE,IID_IPicture,(LPVOID*)&pPic); 
    if(FAILED(bResult)) 
    { 
        AfxMessageBox(_T("图形文件装载出错!")); 
        return E_FAIL; 
    } 
    OLE_XSIZE_HIMETRIC hmWidth;//图片的真实宽度 
    OLE_YSIZE_HIMETRIC hmHeight;//图片的真实高度 
    pPic->get_Width(&hmWidth); 
    pPic->get_Height(&hmHeight); 
    //将图形输出到屏幕上 
    bResult=pPic->Render(hDC_Temp,0,0,nScrWidth,nScrHeight, 
        0,hmHeight,hmWidth,-hmHeight,NULL); 
    CloseHandle(hFile);//关闭打开的文件 
  
    pPic->Release(); 
    // Free memory. 
    GlobalFree(hGlobal); 
    if (SUCCEEDED(bResult)) 
    { 
        return S_OK; 
    } 
    else 
    { 
        AfxMessageBox(_T("图形文件装载出错!")); 
        return E_FAIL; 
    } 
}

时间: 2025-01-02 13:46:23

利用COM组件IPicture读取jpg、gif、bmp图片文件数据和显示图片的相关文章

C#如何读取win7操作系统里的文件夹里的图片缩略图?

问题描述 C#如何读取win7操作系统里的文件夹里的图片缩略图?winXP的缩略图是在本文件夹里的有个隐藏文件thumb.db但是win7的缩略图不是存在本文件夹里的.是存在这样的路经下C:UsersAdministratorAppDataLocalMicrosoftWindowsExplorer那么C#如何读取win7操作系统里的文件夹里的图片缩略图?有做过的,解答一下 解决方案 解决方案二:顶个帖解决方案三:帮顶解决方案四:有做过的吗?解决方案五:没做过,人工帮顶

JQuery读取XML文件数据并显示的实现代码_jquery

准备工作 在开始之前我们需要做如下准备工作: 1.创建一个名为DEMO.html空白html文件:(推荐使用Editplus创建) 2.熟悉JQuery框架的基本语法:(不熟悉没关系,后面我会注释得很详细) 3.创建一个名为data.xml的XML文件用来存储数据,XML的结构下面会涉及到,你也可以下载我打包好的文件查看: 4.一个loading.gif图片,这个图片用于在将XML读取出来的等待时间里面显示在空白html文档中 正式开始 Step 1:首先让我们看看这个data.xml的简单结构

c++11-C++11里怎么读取图片文件

问题描述 C++11里怎么读取图片文件 我想把图片文件读取内存,然后把它存到另一个地方,我试着自己写了一下,但是文件一直打不开,我的系统是ubuntu14.04.这是我的部分代码: void sReadFile("/home/bob/Downloads/123.jpg") { char buff[20480] = ""; std::ifstream fread(file,std::ios::binary); fread.read(buff,sizeof(buff))

socket如何读取上传文件数据

问题描述 我有用ServerSocketserver=newServerSocket(80);去监听80端口.接着我用Socketclient=server.accept();client.setKeepAlive(true);InputStreamin=client.getInputStream();byte[]buff=newbyte[1024*100];intlen=in.read(buff); 去读取客户端的请求信息.测试:我用get方式,post的application/x-www-f

excel-C# 利用com组件 读取Excel获取 该单元格的内容,背景,是否有删除线等属性

问题描述 C# 利用com组件 读取Excel获取 该单元格的内容,背景,是否有删除线等属性 最近利用C# 读取Excel,但是部分单元格中是有删除线的,部分有背景的,目前我只能读取该单元格的内容,不能读取该单元格的 背景,是否有删除线 这些属性信息 解决方案 如果你的excel格式是open XML格式的(xlsx),则可以用DocumentFormat.OpenXml.dll里面的API获取

利用Java 创建和读取Excel文档

excel|创建 为了保证示例程序的运行,必须安装Java 2 sdk1.4.0 和Jakarta POI,Jakarta POI的Web站点是: http://jakarta.apache.org/poi/ 示例1将演示如何利用Jakarta POI API 创建Excel 文档. 示例1程序如下:import org.apache.poi.hssf.usermodel.HSSFWorkbook;import org.apache.poi.hssf.usermodel.HSSFSheet;im

利用JMail组件快速构建邮件程序(下)

上文<利用JMail组件快速构建邮件程序(上)>中介绍了邮件的发送,本文将介绍邮件的接收过程,示例代码运行效果图如下: 三.邮件接收篇 3.1 利用IPOP3接收邮件 接收邮件时用到的接口是IPOP3, 首先连接上邮件服务器,从Messages中得到邮件信息集合,然后就可以通过遍历集合取得每条Message中的具体内容. 请看如下代码: jmail::IPOP3Ptr pPOP3("JMail.POP3"); // 非必须,设置超时时间为60秒,默认为120秒 pPOP3-

mfc- MFC读取24位bmp图像出问题了,求大神来解决

问题描述 MFC读取24位bmp图像出问题了,求大神来解决 我要实现的是将24位bmp文件读入并在用户区显示,但是显示结果都不对的,谁能来帮忙看下? 注:因为对bmp文件还要做后续的处理(比如RGB转CMYK这样的),所以我现在写的代码只是一个测试是否正确读取bmp的程序.用其它控件去读取图片对我来说是毫无用处的. 这是我的代码: void CMy3View::OnLoad() { // TODO: 在此添加命令处理程序代码 CString strFilter,strFilename,info;

C#利用Office组件如何获取Word中某一节的总页数

问题描述 C#利用Office组件操作Word,我已经知道如何获取文档总页数:intpages=myWordDoc.ComputeStatistics(WdStatistic.wdStatisticPages,refNothing);现在我要获取的是分节文档中某一节的页数,该如何实现? 解决方案 解决方案二:office组件很少用带局限性,可以用这个插件aspose,操作word还是很方便