Going from a JPG/GIF/BMP File to a HBITMAP File Using Plain API
Posted
by Michael Chourdakis
on June 11th, 2003
Here is a simple function that loads a JPG/GIF/BMP file into memory and returns a HBITMAP. The function uses IPicture, an OLE interface. #include <olectl.h> and <ole2.h> are also needed.
// Function LoadAnImage: accepts a file name and returns a HBITMAP. // On error, it returns 0. HBITMAP LoadAnImage(char* FileName) { // Use IPicture stuff to use JPG / GIF files IPicture* p; IStream* s; IPersistStream* ps; HGLOBAL hG; void* pp; FILE* fp; // Read file in memory fp = fopen(FileName,"rb"); if (!fp) return NULL; fseek(fp,0,SEEK_END); int fs = ftell(fp); fseek(fp,0,SEEK_SET); hG = GlobalAlloc(GPTR,fs); if (!hG) { fclose(fp); return NULL; } pp = (void*)hG; fread(pp,1,fs,fp); fclose(fp); // Create an IStream so IPicture can // CreateStreamOnHGlobal(hG,false,&s); if (!s) { GlobalFree(hG); return NULL; } OleLoadPicture(s,0,false,IID_IPicture,(void**)&p); if (!p) { s->Release(); GlobalFree(hG); return NULL; } s->Release(); GlobalFree(hG); HBITMAP hB = 0; p->get_Handle((unsigned int*)&hB); // Copy the image. Necessary, because upon p's release, // the handle is destroyed. HBITMAP hBB = (HBITMAP)CopyImage(hB,IMAGE_BITMAP,0,0, LR_COPYRETURNORG); p->Release(); return hBB; }

Comments
How to use
Posted by CNemo on 04/24/2009 04:04pmI got it to work via: #1 remove comment characters CreateStreamOnHGlobal(hG,false,&s); //this line should be executed. #2. m_Ctl_BitMap_Pic.SetBitmap(LoadAnImage("c:\\myjpeg.jpg")); // place pic control on dialog and set to bitmap. ...basically there is an error in the article the line in #1 above is commented out and it SHOULD NOT BE.
ReplyHow to use
Posted by e e;:g:7i# on 03/14/2009 12:48pmI still do not understand can talk about how to give me call this? What are the parameters?
Replyuseless
Posted by carl666 on 01/02/2009 07:27amSee the KB for OleLoadPicture, a lot better of course
ReplyCan not use
Posted by crazycn110 on 09/29/2007 01:34pmwarning C4101: 'ps' : unreferenced local variable warning C4700: local variable 's' used without having been initialized Linking...
ReplyThanks
Posted by hiren241183 on 09/19/2007 03:34amhi , thank you very much.this artical is very helpful to me.
ReplyApplication crashes + 1 more question
Posted by Ali Imran on 01/12/2007 08:39pmThis is really great resource, thanks alot. 1. My application crashes when I use this function, even if the jpeg exists and has proper jpeg format and extenstion. 2. Michael, may I use your function in RAD C++ GUI Library ? regards
Replycxvbvxbzb
Posted by janardhanpalla on 07/14/2006 05:20amNew:Play GIF animate within diagram application
Posted by cindyonlyone on 01/16/2006 09:35pmIf you want to play GIF animate within your application,you can try XD++ MFC Library with: http://www.ucancode.net
ReplyPassing a CString Variable
Posted by dacky on 12/15/2005 03:41amHow can i pass a CString Variable to this function if it accepts char *(pointer to a character)? What if i will use a CFileDialog's .GetPathName Function? this will return a CString variable
ReplyHow to save back In the file ( .jpeg ,.bmp format)
Posted by anantwakode on 09/28/2005 12:28amHi Thanks!! I need to save BITMAP in to file in .jpeg format. Can you post some sample code/way/article to achieve this.. Anant
ReplyLoading, Please Wait ...