【发布时间】:2011-01-06 15:59:03
【问题描述】:
我有一个想要动态加载的位图图像。但我无法加载它。
CBitmap bmp;
bmp.LoadBitmap("c:\\aeimg");
它似乎不起作用。 谁能帮帮我。
谢谢。
【问题讨论】:
标签: mfc visual-c++
我有一个想要动态加载的位图图像。但我无法加载它。
CBitmap bmp;
bmp.LoadBitmap("c:\\aeimg");
它似乎不起作用。 谁能帮帮我。
谢谢。
【问题讨论】:
标签: mfc visual-c++
要从文件加载位图,您需要使用 LoadImage 和 LR_LOADFROMFILE 标志。
【讨论】:
你也可以试试这样的:
CImage image;
image.Load(_T("C:\\image.png"));
CBitmap bitmap;
bitmap.Attach(image.Detach());
【讨论】:
上次我尝试/检查时,CImage 不适用于 png。看看 CxImage - http://www.codeproject.com/KB/graphics/cximage.aspx 。
【讨论】:
这可能就像您忘记转义反斜杠一样简单。 而不是
bmp.LoadBitmap("c:\aeimg");
使用
bmp.LoadBitmap("c:\\aeimg");
否则,您将向 LoadBitmap 方法传递无效路径。
【讨论】:
根据 CBitmap 文档:LoadBitmap() 函数获取位图的资源标识符或位图的资源 id。
您不能指定位图文件的路径。
例如
MyProject.rc
------------
MYBMP BITMAP "res\myimage.bmp"
并确保 resource.h 没有任何 MYBMP 条目,否则在预处理期间将其替换为 id 并最终 LoadBitmap() 将失败,因为应用程序无法找到资源,因为 FindResource() 失败。
现在这样做:
CBitmap bmp;
bmp.LoadBitmap(L"MYBMP");
它肯定会加载位图。
【讨论】:
CBitmap 不支持直接读取 .bmp 文件。您可以按照其他答案中的建议使用 CImage 类。您需要在代码中包含 atlimage.h 才能使 CImage 工作:
#include <atlimage.h>
:
CImage img;
img.Load (_T("C:\\image.bmp"));
CBitmap bitmap;
bitmap.Attach(img.Detach());
另一种方法是使用LoadImage Win32 API 加载图像,然后将CBitmap 附加到该图像:
HBITMAP hBitmap = (HBITMAP)LoadImage(NULL,"c:\\image.bmp",
IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
if (hBitmap != NULL)
bitmap.Attach(hBitmap);
【讨论】:
CString filename;
TCHAR szFilter[] = _T("Bitmap (*.bmp)|*.bmp|PNG (*.png)|*.png||");
CFileDialog selDlg(TRUE, NULL, NULL, OFN_OVERWRITEPROMPT | OFN_EXTENSIONDIFFERENT, szFilter, this);
if (selDlg.DoModal() == IDOK)
{
filename = selDlg.GetPathName();
CImage image;
HBITMAP hBitmap = (HBITMAP)LoadImage(NULL,filename, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
if (hBitmap)
{
// Delete the current bitmap
if (m_bmpBitmap.DeleteObject())
m_bmpBitmap.Detach(); // If there was a bitmap, detach it
// Attach the currently loaded bitmap to the bitmap object
m_bmpBitmap.Attach(hBitmap);
Invalidate();
}
}
【讨论】:
当使用迄今为止提到的解决方案时,每次将 CImage 加载到 CBitmap 上时,使用 CBitmap 的成员变量时,我都会不断发生内存泄漏。我用以下代码解决了这个问题:
CString _fileName(/*Path to image*/);
CImage _image;
HRESULT hr = _image.Load(_fileName);
if (SUCCEEDED(hr)) {
if (m_Display.m_bmpImage.DeleteObject())
m_Display.m_bmpImage.Detach();
m_bmpImage.Attach(_image->Detach());
}
【讨论】: