dev ray
dev ray

Reputation: 485

Load a CBitmap dynamically

I have a Bitmap image that i want to load dynamically. But I am unable to load it.

CBitmap bmp;

bmp.LoadBitmap("c:\\aeimg");

it does not seem to be working. Can someone please help me.

Thanks.

Upvotes: 10

Views: 17984

Answers (8)

guivi
guivi

Reputation: 402

When using the solutions mentioned to date, with a member variable of CBitmap I kept getting memory leaking every time I loaded the CImage onto the CBitmap. I solved this with the following code:

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

Upvotes: 0

user4822420
user4822420

Reputation: 54

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

}

Upvotes: 0

Jaywalker
Jaywalker

Reputation: 3119

CBitmap doesn't support directly reading from a .bmp file. You can instead make use of CImage class as suggested in other answers. You'll need to include atlimage.h in your code to make CImage work:

#include <atlimage.h>
:
CImage img;
img.Load (_T("C:\\image.bmp"));
CBitmap bitmap;
bitmap.Attach(img.Detach());

Another way is to load the image using LoadImage Win32 API and then attaching CBitmap to that:

HBITMAP hBitmap = (HBITMAP)LoadImage(NULL,"c:\\image.bmp", 
                                      IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
if (hBitmap != NULL) 
   bitmap.Attach(hBitmap);

Upvotes: 1

Ashish
Ashish

Reputation: 8529

According to CBitmap documentation: LoadBitmap() function takes resource identifier of the bitmap or resource id of the bitmap.

You can't specify the path of the bitmap file.

E.g.

MyProject.rc
------------
MYBMP      BITMAP  "res\myimage.bmp"

and make sure that resource.h does not have any entry of MYBMP otherwise during preprocessing its replaced by id and ultimately LoadBitmap() will fail since application can't locate the resource as FindResource() fails.

Now do this :

CBitmap bmp;
bmp.LoadBitmap(L"MYBMP");

It will definitely load the bitmap.

Upvotes: 3

Stefan
Stefan

Reputation: 43585

It could be as simple as you forgetting to escape the backslash. Instead of

bmp.LoadBitmap("c:\aeimg");

use

bmp.LoadBitmap("c:\\aeimg");

Otherwise you're passing an invalid path to the LoadBitmap method.

Upvotes: 0

Roel
Roel

Reputation: 19642

CImage doesn't work with png last time I tried / checked. Have a look at CxImage - http://www.codeproject.com/KB/graphics/cximage.aspx .

Upvotes: 0

Nikola Smiljanić
Nikola Smiljanić

Reputation: 26863

You can also try something like this:

CImage image;
image.Load(_T("C:\\image.png"));
CBitmap bitmap;
bitmap.Attach(image.Detach());

Upvotes: 14

Jerry Coffin
Jerry Coffin

Reputation: 490738

To load a bitmap from a file, you want to use LoadImage with the LR_LOADFROMFILE flag.

Upvotes: 1

Related Questions