### MFC C++ 读取图片资源被占用无法显示替换 在MFC(Microsoft Foundation Classes)框架下开发C++应用程序时,经常会遇到处理图像资源的需求。例如,在开发一个图形界面应用时,可能需要动态地加载、修改并显示图像。本文将针对“MFC C++ 读取图片资源被占用无法显示替换”这一问题进行详细分析,并提供解决方案。 #### 问题背景 当程序尝试更新界面上显示的图像时,如果该图像资源已经被占用,则可能导致新图像无法被实时显示。这通常发生在以下场景: - 当前图像仍然处于打开状态。 - 图像资源未正确释放。 - 内存中的图像数据未能及时更新。 #### 解决方案 为了确保能够实时显示最新的图像,我们需要采取措施来释放被占用的图像资源,并正确加载新图像到内存中。下面将通过两个函数`LoadBitmapFromFile`和`LoadBitmapFromMemory`来详细解释这一过程。 ### LoadBitmapFromFile 函数解析 此函数用于从文件中加载图像资源。具体步骤如下: 1. **打开文件**:首先使用`CreateFile`函数以只读方式打开指定的文件。这里需要注意的是,`CreateFile`函数的第一个参数为文件路径,第二个参数`GENERIC_READ`表示打开文件的目的是读取数据,第三个参数`FILE_SHARE_READ`表示允许其他进程同时读取该文件。 2. **获取文件大小**:通过`GetFileSize`函数获取文件的实际大小。这里还做了一个检查,确保文件大小不为零且高位为零,即确保文件大小不超过4GB。 3. **读取文件内容到缓冲区**:分配一块足够大的内存空间用于存储文件内容,然后使用`ReadFile`函数将文件内容读入到缓冲区中。 4. **创建Bitmap对象**:调用`LoadBitmapFromMemory`函数将缓冲区中的内容转换为Bitmap对象。 5. **清理资源**:释放之前分配的内存,并关闭文件句柄。 ### LoadBitmapFromMemory 函数解析 此函数的作用是从内存中加载图像资源。具体实现如下: 1. **创建IStream流**:使用`CreateStreamOnHGlobal`函数创建一个IStream流对象,该对象指向一个全局内存区域。 2. **设置流大小**:调用`SetSize`方法设置流的大小,使其与图像数据的大小相匹配。 3. **写入图像数据**:使用`Write`方法将内存中的图像数据写入到IStream流中。 4. **创建Bitmap对象**:通过传递IStream流对象给`Bitmap`构造函数创建Bitmap对象。 5. **释放流对象**:最后释放IStream流对象。 ### 实践建议 1. **确保资源释放**:在更新图像之前,确保旧的图像资源已被正确释放。可以通过销毁旧的Bitmap对象来实现这一点。 2. **避免内存泄漏**:注意检查并释放所有分配的内存空间,如在`LoadBitmapFromFile`函数中分配的`unsigned char`数组。 3. **异常处理**:在实际编程过程中,还需要增加错误处理机制,比如当文件打开失败或内存分配失败时,应当有相应的错误提示或处理逻辑。 4. **性能优化**:对于频繁更新图像的应用程序,可以考虑缓存机制,减少重复读取文件的操作,提高性能。 通过上述方法,可以有效地解决MFC C++应用程序中读取图片资源被占用无法显示替换的问题,从而实现更流畅的用户体验。





























mfc下如果读取本地图片后想修改图片的话一般会出现图片资源被占用的情况,
如果把图片拷贝到内存后再使用就不会出现这个情况
我在视频截屏后实时显示图片的情况下发现一张占用 无法实时显示最新的
希望能对大家有所帮助
*/
// 从文件加载图片,不独占文件,失败返回NULL
Bitmap* LoadBitmapFromFile(const TCHAR* file_name)
{
Bitmap* bmp = NULL;
HANDLE file_handle = CreateFile(file_name, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (file_handle != INVALID_HANDLE_VALUE)
{
DWORD temp = 0;
DWORD file_size = GetFileSize(file_handle, &temp);
if (file_size && !temp) // 不处理大于4G的文件
{
// 将图片文件读到内存后,再从内存创建Bitmap
unsigned char* buffer = new unsigned char[file_size];
if (ReadFile(file_handle, buffer, file_size, &temp, NULL))
bmp = LoadBitmapFromMemory(buffer, temp);
delete [] buffer;
}
CloseHandle(file_handle);
}
return bmp;
}


- 粉丝: 0
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- GOAT(山羊)是基于 LlaMa 进行 SFT 的中英文大语言模型
- 借助 ChatGPT 大语言模型通过聊天机器人自动搭建 vulhub 漏洞靶机环境
- 一个 JavaScript 的简单范例程序-创建一个简单的待办事项列表(Todo List)
- 第二届广州・琶洲算法大赛智能交通 CV 模型赛题第四名方案
- 第二届广州・琶洲算法大赛智能交通 CV 模型赛题第 4 名解决方案
- 基于ChatGPT大语言模型,通过聊天机器人自动创建vulhub的漏洞靶机环境
- Python 的排序算法范例程序-实现快速排序算法
- 从零开始编写大语言模型相关所有代码用于学习
- kindeditor多图上传H5版 ,替换到原来的plugins\multiimage目录下就可用,无须修改原来的调用代码,要记得刷新缓存
- CID解码最新300-CD软件
- CID解码最新300-CD软件
- 结合大模型强大的自然语言处理能力,自动化地生成全面、高质量的测试用例
- CID解码最新300-CD软件
- MATLAB实现NMEA 0183数据可视化工具
- MATLAB实现NMEA 0183数据可视化工具
- aspmkr7_1.zip


