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; 
    } 
}

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

  1. 基于SqlSugar的开发框架循序渐进介绍(10)-- 利用axios组件的封装,实现对后端API数据的访问和基类的统一封装处理

    在SqlSugar的开发框架的后端,我们基于Web API的封装了统一的返回结果,使得WebAPI的接口返回值更加简洁,而在前端,我们也需要统一对返回的结果进行解析,并获取和Web API接口对应的数 ...

  2. java读取目录下所有csv文件数据,存入三维数组并返回

    package dwzx.com.get; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; ...

  3. Python中通过Image的open之后,去show结果打不开bmp图片,无法正常显示图片

    在windows的cmd命令行下,使用Python的PIL库打开并显示一个jpg图片: ? 1 2 3 openedImg = Image.open(saveToFile); print " ...

  4. ci框架读取上传的excel文件数据

    原文链接: https://blog.csdn.net/qq_38148394/article/details/87921373 此功能实现使用到PHPExcel类库,PHPExcel是一个PHP类库 ...

  5. 读取raw目录中的文件数据

    try { InputStream is2 = getResources().openRawResource(R.raw.info); InputStreamReader isr2 = new Inp ...

  6. 从数据库读取二进制图片,img标签显示图片

    引自 http://www.w3dev.cn/article/20110214/asp-net-csharp-image-base64-change.aspx      <img src=&qu ...

  7. 读取FTP 图片文件,并显示,非下载

    关于FTP,先从怎么创建开始说起,很简单,步骤就两个 ① 电脑-右键管理--本地用户组--添加用户名,密码(用于FTP的用户名.密码) ② IIS 新建FTP站点,命名,指定端口号.FTP文件路径 接 ...

  8. c# 用OpenXmL读取.xlsx格式的Excel文件 返回DataTable

    1.须要引用的dll :  DocumentFormat.OpenXml.dll  ---须要安装一下OpenXml再引用 WindowsBase  ---直接在项目里加入引用 2.方法: /// & ...

  9. 利用matplot简单显示图片

    import matplotlib.pyplot as plt from matplotlib.image import imread img = imread('F:\\ml\\DL\\source ...

随机推荐

  1. Eclipse IDE for Java EE Developers使用和新建工程helloworld

    开发j2ee还是用专门的java ee eclipse,自带了许多开发j2ee的插件,包括: This package includes: Data Tools Platform Eclipse Gi ...

  2. 【转】Android下编译jni库的二种方法(含示例) -- 不错

    原文网址:http://blog.sina.com.cn/s/blog_3e3fcadd01011384.html 总结如下:两种方法是:1)使用Android源码中的Make系统2)使用NDK(从N ...

  3. android连续点击两次返回键退出代码

    private long exitTime = 0; @Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCo ...

  4. UESTC_秋实大哥与家 2015 UESTC Training for Data Structures<Problem E>

    E - 秋实大哥与家 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...

  5. 关于memcpy和memmove的一点说明

    今天看到书上降到memcpy和memmove的区别才突然发现原来两者之间有如此区别,以前只知道这两个函数是 实现同样的功能,没有接触到其不同. memcpy和memmove在MSDN的定义如下: 从两 ...

  6. Pattern | CLiPS

    Pattern | CLiPS Pattern Pattern is a web mining module for the Python programming language. It has t ...

  7. 键盘code码速查表

    键盘 Key Code对照表 字母和数字键的键码值(keyCode) 按键 键码 按键 键码 按键 键码 按键 键码 A 65 J 74 S 83 1 49 B 66 K 75 T 84 2 50 C ...

  8. 关于MAC的pkg和mpkg的分别

    程序制作完毕后,在mac下通常的方法是要制作一个pkg的安装包,可是你会发现pkg和mpkg的文件出现的比較多,笔者也是经过了一定的试验和尝试,才了解到,pkg是单个文件的pkg,而mpkg事实上是多 ...

  9. BCD码、十六进制与十进制互转

    在做嵌入式软件的设计中,常常会遇到十六进制.BCD码与十进制之间的转换,近期做M1卡的应用中,涉及了大量的十六进制.BCD码与十进制之间的转换.通过对BCD码.十六进制 权的理解,轻松的实现了他们之间 ...

  10. Ubuntu 系统搭建php服务器 用ssh 远程操作

    一:在桌面下载xshell客户端连接 ,vmavar 上的 Ubuntu系统,遇到的问题跟大家分享一下,希望大家少走弯路 Ubuntu系统默认没有ssh server 要安装 apt-get inst ...