解决GDI+Bitmap对图片文件的独占

xdml2_1 2012-12-20 11:36:54
我用Bitmap加载本地图片文件后,无法对该文件进行重命名或删除(CImage就没有这个问题),请问有没有解决方法?
...全文
315 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
hjshow 2013-06-19
  • 打赏
  • 举报
回复
4楼,出错error C2660: 'Gdiplus::GdiplusBase::operator new' : function does not take 3 argument了,第34句:bmp=new Bitmap(stream);新手求解
xdml2_1 2012-12-24
  • 打赏
  • 举报
回复
非常感谢各位!
StarsunYzL 2012-12-20
  • 打赏
  • 举报
回复

// 从文件加载图片,不独占文件,失败返回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;
}

// 从内存加载图片,失败返回NULL
Bitmap* LoadBitmapFromMemory(const void* memory, DWORD size)
{
    Bitmap* bmp = NULL;
    IStream* stream = NULL;
    if (CreateStreamOnHGlobal(NULL, TRUE, &stream) == S_OK)
    {
        ULARGE_INTEGER uli;
        uli.QuadPart = size;
        stream->SetSize(uli);
        if (stream->Write(memory, size, NULL) == S_OK)
            bmp = new Bitmap(stream);
        stream->Release();
    }
    return bmp;
}
百事烟 2012-12-20
  • 打赏
  • 举报
回复
引用 1 楼 xdml2_1 的回复:
不知如果将图片文件读到内存,怎么与一个Bitmap关联?
		IStream* pStream = NULL;
		CreateStreamOnHGlobal(NULL, TRUE, &pStream);//在堆中创建流对象
		pStream->Write(pPuf, nBufSize, NULL);
		Bitmap *pSrcBmp = Bitmap::FromStream(pStream);
                //...操作bmp		
		delete pSrcBmp;
		pStream->Release();
百事烟 2012-12-20
  • 打赏
  • 举报
回复
没啥好办法,确实是独占的,delete Bitmap后可改名操作,只能取巧比如: Bitmap bmp(filename); //操作bmp //......... delete bmp; rename(file);//也可以postmessage,在消息响应中再delete ;rename
xdml2_1 2012-12-20
  • 打赏
  • 举报
回复
不知如果将图片文件读到内存,怎么与一个Bitmap关联?

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧