CImage从内存和资源中加载图片文件

2024-03-23 16:18

本文主要是介绍CImage从内存和资源中加载图片文件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

用CImage加载内存里的Image

问题:已知一块内存,知道里面是一张图片的数据,如何显示出来?

一种解决方法:
CImage(MFC or ATL)提供了一个加载内存中Image的成员函数HRESULT CImage::Load(IStream* pStream)。如何把指定的内存转换为IStream接口就成了需要解决的问题。最后发现获取一个ISteam还真是曲折:): 

void  LoadMemImage( void *  pMemData,  long  len)
  {
  HGLOBAL hGlobal  GlobalAlloc(GMEM_MOVEABLE, len);
   void *  pData  GlobalLock(hGlobal);
  memcpy(pData, pMemData, len);
  GlobalUnlock(hGlobal);

  IStream *  pStream  NULL;
   if  (CreateStreamOnHGlobal(hGlobal, TRUE,  & pStream)  ==  S_OK)
    {
   CImage image;
    if (SUCCEEDED(image.Load(pStream)))
     {
     //   ..
 
   }
   pStream -> Release();    
  }
  GlobalFree(hGlobal);

}


 

CImage从资源中加载图片文件
CImage直接加载图片文件倒是好办,直接用Load函数就可以,但是如何从工程资源中添加jpg、gif、png等图片呢?用下面这个函数

BOOL CDDCDlg::LoadImageFromResource(ATL::CImage *pImage, UINT nResID,LPCTSTR lpTyp)
{
    if( pImage ==NULL)returnfalse;

    pImage->Destroy();

    // 查找资源
    HRSRC hRsrc =::FindResource(AfxGetResourceHandle(), MAKEINTRESOURCE(nResID), lpTyp);
    if(hRsrc ==NULL)returnfalse;

    // 加载资源
    HGLOBAL hImgData =::LoadResource(AfxGetResourceHandle(), hRsrc);
    if(hImgData ==NULL)
    {
        ::FreeResource(hImgData);
        returnfalse;
    }

    // 锁定内存中的指定资源
    LPVOID lpVoid    =::LockResource(hImgData);

    LPSTREAM pStream =NULL;
    DWORD dwSize    =::SizeofResource(AfxGetResourceHandle(), hRsrc);
    HGLOBAL hNew    =::GlobalAlloc(GHND, dwSize);
    LPBYTE lpByte    =(LPBYTE)::GlobalLock(hNew);
    ::memcpy(lpByte, lpVoid, dwSize);

    // 解除内存中的指定资源
    ::GlobalUnlock(hNew);

    // 从指定内存创建流对象
    HRESULT ht =::CreateStreamOnHGlobal(hNew,TRUE,&pStream);
    if( ht != S_OK )
    {
        GlobalFree(hNew);
    }
    else
    {
        // 加载图片
        pImage->Load(pStream);

        GlobalFree(hNew);
    }
    // 释放资源
    ::FreeResource(hImgData);
    returntrue;
}

 

这篇关于CImage从内存和资源中加载图片文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/838875

相关文章

Java使用Spire.Doc for Java实现Word自动化插入图片

《Java使用Spire.DocforJava实现Word自动化插入图片》在日常工作中,Word文档是不可或缺的工具,而图片作为信息传达的重要载体,其在文档中的插入与布局显得尤为关键,下面我们就来... 目录1. Spire.Doc for Java库介绍与安装2. 使用特定的环绕方式插入图片3. 在指定位

Python多任务爬虫实现爬取图片和GDP数据

《Python多任务爬虫实现爬取图片和GDP数据》本文主要介绍了基于FastAPI开发Web站点的方法,包括搭建Web服务器、处理图片资源、实现多任务爬虫和数据可视化,同时,还简要介绍了Python爬... 目录一. 基于FastAPI之Web站点开发1. 基于FastAPI搭建Web服务器2. Web服务

springboot+mybatis一对多查询+懒加载实例

《springboot+mybatis一对多查询+懒加载实例》文章介绍了如何在SpringBoot和MyBatis中实现一对多查询的懒加载,通过配置MyBatis的`fetchType`属性,可以全局... 目录springboot+myBATis一对多查询+懒加载parent相关代码child 相关代码懒

Java JAR 启动内存参数配置指南(从基础设置到性能优化)

《JavaJAR启动内存参数配置指南(从基础设置到性能优化)》在启动Java可执行JAR文件时,合理配置JVM内存参数是保障应用稳定性和性能的关键,本文将系统讲解如何通过命令行参数、环境变量等方式... 目录一、核心内存参数详解1.1 堆内存配置1.2 元空间配置(MetASPace)1.3 线程栈配置1.

利用Python将PDF文件转换为PNG图片的代码示例

《利用Python将PDF文件转换为PNG图片的代码示例》在日常工作和开发中,我们经常需要处理各种文档格式,PDF作为一种通用且跨平台的文档格式,被广泛应用于合同、报告、电子书等场景,然而,有时我们需... 目录引言为什么选择 python 进行 PDF 转 PNG?Spire.PDF for Python

MyBatis延迟加载与多级缓存全解析

《MyBatis延迟加载与多级缓存全解析》文章介绍MyBatis的延迟加载与多级缓存机制,延迟加载按需加载关联数据提升性能,一级缓存会话级默认开启,二级缓存工厂级支持跨会话共享,增删改操作会清空对应缓... 目录MyBATis延迟加载策略一对多示例一对多示例MyBatis框架的缓存一级缓存二级缓存MyBat

Python内存管理机制之垃圾回收与引用计数操作全过程

《Python内存管理机制之垃圾回收与引用计数操作全过程》SQLAlchemy是Python中最流行的ORM(对象关系映射)框架之一,它提供了高效且灵活的数据库操作方式,本文将介绍如何使用SQLAlc... 目录安装核心概念连接数据库定义数据模型创建数据库表基本CRUD操作创建数据读取数据更新数据删除数据查

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni

k8s容器放开锁内存限制问题

《k8s容器放开锁内存限制问题》nccl-test容器运行mpirun时因NCCL_BUFFSIZE过大导致OOM,需通过修改docker服务配置文件,将LimitMEMLOCK设为infinity并... 目录问题问题确认放开容器max locked memory限制总结参考:https://Access

Android实现图片浏览功能的示例详解(附带源码)

《Android实现图片浏览功能的示例详解(附带源码)》在许多应用中,都需要展示图片并支持用户进行浏览,本文主要为大家介绍了如何通过Android实现图片浏览功能,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码