user-0 提问: 把jpg文件读到内存后，用二进制读进去的，放到一个char*  内存里， 然后怎么把这个 char* 内存 赋值给一个 HBITMAP 

回复:
user: user-1
content: 引用 17 楼 cutmelon 的回复:赵老师您真有闲，哈，用VC6的我10年前就这么写过，不过支持的图片格式少了点，我给您翻出来瞅瞅 void DrawPicOld(CDC *pDC,char *buf,int len) { 	//内存数据转换成流 	HGLOBAL hMem=GlobalAlloc(GMEM_FIXED,len); 	BYTE* pMem=(BYTE*)GlobalLock(hMem); 	memcpy(pMem,buf,len); 	IStream* pStreamm; 	HRESULT hr=CreateStreamOnHGlobal(pMem,FALSE,&pStreamm);  	//生成ole图片对象 	IPicture *pPic; 	hr=OleLoadPicture(pStreamm,0,FALSE,IID_IPicture,(void**)&pPic);  	//画图前需要计算像素大小 	long hmWidth,hmHeight; 	pPic->get_Width(&hmWidth); 	pPic->get_Height(&hmHeight); 	CSize sz(hmWidth,hmHeight); 	pDC->HIMETRICtoDP(&sz);  	//画到DC 	pPic->Render(*pDC,0,0,sz.cx,sz.cy,0,hmHeight,hmWidth,-hmHeight,NULL);  	//清理 	pPic->Release(); 	pStreamm->Release(); 	GlobalFree(hMem); } 又学了一招。足见我VC/MFC/ATL是门外汉啊！

user: user-1
content: 引用 9 楼 czy_163_com 的回复:这样做是可以的，但是我已经从数据库中取到内存了， 再存回磁盘，然后再从磁盘读上来，有点绕弯了。 那是因为你之前 将.jpg文件从磁盘读出来，再存到数据库中，有点绕弯了。

user: user-0
content: 多谢各位老师了，看来应该可以了，我需要的就是这个。怎么给分都不清楚呢，我是个新手。

user: user-2
content: 赵老师您真有闲，哈，用VC6的我10年前就这么写过，不过支持的图片格式少了点，我给您翻出来瞅瞅 void DrawPicOld(CDC *pDC,char *buf,int len) { 	//内存数据转换成流 	HGLOBAL hMem=GlobalAlloc(GMEM_FIXED,len); 	BYTE* pMem=(BYTE*)GlobalLock(hMem); 	memcpy(pMem,buf,len); 	IStream* pStreamm; 	HRESULT hr=CreateStreamOnHGlobal(pMem,FALSE,&pStreamm);  	//生成ole图片对象 	IPicture *pPic; 	hr=OleLoadPicture(pStreamm,0,FALSE,IID_IPicture,(void**)&pPic);  	//画图前需要计算像素大小 	long hmWidth,hmHeight; 	pPic->get_Width(&hmWidth); 	pPic->get_Height(&hmHeight); 	CSize sz(hmWidth,hmHeight); 	pDC->HIMETRICtoDP(&sz);  	//画到DC 	pPic->Render(*pDC,0,0,sz.cx,sz.cy,0,hmHeight,hmWidth,-hmHeight,NULL);  	//清理 	pPic->Release(); 	pStreamm->Release(); 	GlobalFree(hMem); }

user: user-1
content: 引用 14 楼 cutmelon 的回复:[quote=引用 12 楼 zhao4zhong1 的回复:] [quote=引用 11 楼 cutmelon 的回复:] 这个问题不是很复杂啊，楼主我给你段代码吧，如果你是在windows下开发直接就能用 void DrawPic(CDC *pDC,char *buf,int len) { 	//内存数据转换成流 	HGLOBAL hMem=GlobalAlloc(GMEM_FIXED,len); 	BYTE* pMem=(BYTE*)GlobalLock(hMem); 	memcpy(pMem,buf,len); 	IStream* pStream; 	HRESULT hr=CreateStreamOnHGlobal(pMem,FALSE,&pStream);  	//画图 	CImage img; 	img.Load(pStream); 	img.Draw(pDC->GetSafeHdc(),CPoint(0,0));  	//清理 	img.Destroy(); 	pStream->Release(); 	GlobalFree(hMem); } 如果你非要Bitmap的话，参照3楼的说法改改就行了 学习了。 是不是少了句GlobalUnlock(hMem);?[/quote] 这里用的固定块，GMEM_FIXED，没必要unlock[/quote] 哦。受教。

user: user-1
content: 亲测可用，可惜VC6不支持CImage： #pragma comment(lib,"user32") #pragma comment(lib,"gdi32") #include <stdlib.h> #include <stdio.h> #include <io.h> #include <conio.h> #include <windows.h> #include <atlimage.h> #include <objidl.h> void DrawPic(HDC hdc,char *buf,int len) {     HGLOBAL hMem=GlobalAlloc(GMEM_FIXED,len);     BYTE* pMem=(BYTE*)GlobalLock(hMem);     memcpy(pMem,buf,len);     IStream* pStream;     HRESULT hr=CreateStreamOnHGlobal(pMem,FALSE,&pStream);      CImage img;     img.Load(pStream);     img.Draw(hdc,CPoint(0,0));      img.Destroy();     pStream->Release();     GlobalUnlock(hMem);     GlobalFree(hMem); } //HWND WINAPI GetConsoleWindow(); void HideTheCursor() {     CONSOLE_CURSOR_INFO cciCursor;     HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);     if (GetConsoleCursorInfo(hStdOut, &cciCursor)) {         cciCursor.bVisible = FALSE;         SetConsoleCursorInfo(hStdOut, &cciCursor);     } } void ShowTheCursor() {     CONSOLE_CURSOR_INFO cciCursor;     HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);     if (GetConsoleCursorInfo(hStdOut, &cciCursor)) {         cciCursor.bVisible = TRUE;         SetConsoleCursorInfo(hStdOut, &cciCursor);     } } int main() {     HWND  hwnd;     HDC   hdc;     HFONT hfont;     HBITMAP hbm;     HDC hdcBits;     BITMAP bm;      system("color F0");     system("cls");     HideTheCursor();     hwnd  = GetConsoleWindow();     hdc   = GetDC(hwnd);     hfont = CreateFont(48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "华文楷体");     SelectObject(hdc,hfont);     TextOut(hdc,10,10,"这是泡泡",8);     DeleteObject(hfont);     hbm=(HBITMAP)LoadImage(0,"C:\\Windows\\Soap Bubbles.bmp",IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);     if (hbm) {         hdcBits = CreateCompatibleDC(hdc);         GetObject (hbm, sizeof(BITMAP), &bm);         SelectObject(hdcBits,hbm);         BitBlt(hdc,200,10,bm.bmWidth, bm.bmHeight,hdcBits,0,0,SRCCOPY);         DeleteDC(hdcBits);         DeleteObject(hbm);     }     getch();     FILE *f;     f=fopen("c:\\new\\tmp.jpg","rb");     if (f) {         int fl=filelength(fileno(f));         char *buf=(char *)malloc(fl);         if (buf) {             fread(buf,fl,1,f);         }         fclose(f);         if (buf) {             DrawPic(hdc,buf,fl);             free(buf);         }     }     ReleaseDC(hwnd,hdc);     getch();     system("color 07");     system("cls");     ShowTheCursor();     return 0; }

user: user-2
content: 引用 12 楼 zhao4zhong1 的回复:[quote=引用 11 楼 cutmelon 的回复:] 这个问题不是很复杂啊，楼主我给你段代码吧，如果你是在windows下开发直接就能用 void DrawPic(CDC *pDC,char *buf,int len) { 	//内存数据转换成流 	HGLOBAL hMem=GlobalAlloc(GMEM_FIXED,len); 	BYTE* pMem=(BYTE*)GlobalLock(hMem); 	memcpy(pMem,buf,len); 	IStream* pStream; 	HRESULT hr=CreateStreamOnHGlobal(pMem,FALSE,&pStream);  	//画图 	CImage img; 	img.Load(pStream); 	img.Draw(pDC->GetSafeHdc(),CPoint(0,0));  	//清理 	img.Destroy(); 	pStream->Release(); 	GlobalFree(hMem); } 如果你非要Bitmap的话，参照3楼的说法改改就行了 学习了。 是不是少了句GlobalUnlock(hMem);?[/quote] 这里用的固定块，GMEM_FIXED，没必要unlock

user: user-3
content: 你没解码，读进去也不能显示为图像。  你必须用 libjpeg解码，然后得到位图信息，将此位图信息转换为os图形层认识的内存位图格式就可以显示了。

user: user-1
content: 引用 11 楼 cutmelon 的回复:这个问题不是很复杂啊，楼主我给你段代码吧，如果你是在windows下开发直接就能用 void DrawPic(CDC *pDC,char *buf,int len) { 	//内存数据转换成流 	HGLOBAL hMem=GlobalAlloc(GMEM_FIXED,len); 	BYTE* pMem=(BYTE*)GlobalLock(hMem); 	memcpy(pMem,buf,len); 	IStream* pStream; 	HRESULT hr=CreateStreamOnHGlobal(pMem,FALSE,&pStream);  	//画图 	CImage img; 	img.Load(pStream); 	img.Draw(pDC->GetSafeHdc(),CPoint(0,0));  	//清理 	img.Destroy(); 	pStream->Release(); 	GlobalFree(hMem); } 如果你非要Bitmap的话，参照3楼的说法改改就行了 学习了。 是不是少了句GlobalUnlock(hMem);?

user: user-2
content: 这个问题不是很复杂啊，楼主我给你段代码吧，如果你是在windows下开发直接就能用 void DrawPic(CDC *pDC,char *buf,int len) { 	//内存数据转换成流 	HGLOBAL hMem=GlobalAlloc(GMEM_FIXED,len); 	BYTE* pMem=(BYTE*)GlobalLock(hMem); 	memcpy(pMem,buf,len); 	IStream* pStream; 	HRESULT hr=CreateStreamOnHGlobal(pMem,FALSE,&pStream);  	//画图 	CImage img; 	img.Load(pStream); 	img.Draw(pDC->GetSafeHdc(),CPoint(0,0));  	//清理 	img.Destroy(); 	pStream->Release(); 	GlobalFree(hMem); } 如果你非要Bitmap的话，参照3楼的说法改改就行了

user: user-1
content: 引用 7 楼 zhao4zhong1 的回复:[quote=引用 6 楼 czy_163_com 的回复:] 多谢各位， 我试一下。 我的jpg文件已经通过二进制保存在数据库里了。现在从数据库读出后放在char*内存里，想把这个图形通过打印机打印出来 你为什么不 从数据库读出后保存到临时.jpg文件里，再把这个.jpg文件通过打印机打印出来 呢？ [/quote] 如果你嫌这样磨损硬盘的话，将临时文件放在RAM Disk上。

user: user-1
content: 引用 6 楼 czy_163_com 的回复:多谢各位， 我试一下。 我的jpg文件已经通过二进制保存在数据库里了。现在从数据库读出后放在char*内存里，想把这个图形通过打印机打印出来 你为什么不 从数据库读出后保存到临时.jpg文件里，再把这个.jpg文件通过打印机打印出来 呢？

user: user-0
content: 多谢各位， 我试一下。 我的jpg文件已经通过二进制保存在数据库里了。现在从数据库读出后放在char*内存里，想把这个图形通过打印机打印出来

user: user-0
content: 这样做是可以的，但是我已经从数据库中取到内存了， 再存回磁盘，然后再从磁盘读上来，有点绕弯了。

user: user-4
content: 导进资源文件，用CBitmap操作不好吗，太费劲

user: user-5
content: MFC里面有个CImage类 #include <atlimage.h> CImage img; img.Load(L"d:\\1.jpg"); HBITMAP hBitmap = img.Detach();  就可以了。 从char*中读取也可以，不过麻烦点，需要用CreateStreamOnHGlobal创建一个IStream， 然后用IStream::Read()把char*读进去，然后传递给CImage::Load()进行读取

user: user-1
content: 费那事干嘛？ 直接用GDI+的Image对象加载.jpg文件。

user: user-6
content: 那么直接读取为CBitmap行不行 http://blog.csdn.net/huangxy10/article/details/7089093

user: user-7
content: CreateDIBSection得到HBITMAP，得到pbits，拷贝一下就行了