请教怎么把一个流变成CBitmap 我现在要做的是,A功能把一个图片写入数据库,B功能把数据库中的数据取出,然后显示出这张图片A功能好显示,B功能。请大牛帮助问了一个朋友说了一个函数CreateStreamOnHGlobal但是baidu了下都没有例子之类的,请牛牛们指点 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 数据库的blob段,图片按文件流读写不就可以啦,例子网上大把 HBITMAP CreateDIBSection( __in HDC hdc, __in const BITMAPINFO *pbmi,//要创建的设备无关位图信息 __in UINT iUsage, // DIB_PAL_COLORS或者DIB_RGB_COLORS __out VOID **ppvBits, //指向存储位图数据的内存地址, __in HANDLE hSection,//NULL __in DWORD dwOffset //0,文件偏移量);该函数创建一个设备无关位图,第四个参数就是位图的数据流指针。你充数据库里读出位图数据,可以传递给这个参数。第二参数需要初始化。 先创建BITMAPINFO ,再通过CreateDIBSection,得到HBITMAP,然后再通过CBitmap的Attach,得到CBitmap。CBitmap* CSsVPageView::GetCBitmapFromBMPInfo(LONG srcWidth,LONG srcHeight,byte *pGradImg){ void* pBitsDib; CBitmap* wrk_nBitmap; CGdiObject* wrk_pGdiObject; CDC wrk_cdcMem; HBITMAP hBitmap; HDC hdc; LPBITMAPINFO lpbmi = new BITMAPINFO; ZeroMemory(lpbmi, sizeof(BITMAPINFO)); lpbmi-> bmiHeader.biSize = sizeof(BITMAPINFOHEADER); lpbmi-> bmiHeader.biPlanes = 1; lpbmi-> bmiHeader.biCompression = BI_RGB; lpbmi-> bmiHeader.biClrImportant = 0; lpbmi-> bmiHeader.biSizeImage = 0; lpbmi-> bmiHeader.biClrUsed = 0; lpbmi-> bmiHeader.biBitCount = 24; lpbmi-> bmiHeader.biWidth = srcWidth; //lpbmi-> bmiHeader.biHeight = srcHeight; lpbmi-> bmiHeader.biHeight = srcHeight*(-1); lpbmi-> bmiHeader.biXPelsPerMeter= 0; lpbmi-> bmiHeader.biYPelsPerMeter= 0; hdc = ::GetDC(NULL); wrk_cdcMem.CreateCompatibleDC(NULL); hBitmap = ::CreateDIBSection(NULL, lpbmi, DIB_RGB_COLORS, (void**)&pBitsDib, NULL, 0); wrk_nBitmap = new CBitmap(); wrk_nBitmap->Attach(hBitmap); wrk_pGdiObject = wrk_cdcMem.SelectObject(wrk_nBitmap); SetDIBits(wrk_cdcMem.GetSafeHdc(),hBitmap,0,srcHeight,pGradImg,lpbmi,DIB_RGB_COLORS); wrk_cdcMem.SelectObject(wrk_pGdiObject); delete lpbmi; wrk_cdcMem.DeleteDC(); if(hdc != NULL) { ::ReleaseDC(NULL,hdc); } return wrk_nBitmap;} 有什么函数能把CBitmap 转成流。 int GetDIBits( HDC hdc,HBITMAP hbmp,UINT uStartScan,UINT cScanLines,LPVOID lpvBits,LPBITMAPINFO lpbi,UINT uUsage);读取hbmp句柄所标识的位图的数据部分,以二进制流存在lpvbits中。这个内存指针要提前分配好。 fopen当普通的二进制读不行吗?流用GDI+较简单方便 VS2010中Teechart 坐标轴移动问题 怎样让图片在控件内移动? 怎样将文件删除后永远不能恢复? CString和char数组的差别。在注册表中修改REG_MULTI_SZ类型键发现的问题。 求助一篇英文文章,关于图像处理的。 double 类型的四舍五入要求保留位小数立即给分不够再加 一个formview的问题 客户程序怎样使用DCOM 菜鸟问题:如何将一个窗口在隐藏和显示间转换? 如何建立像360软件助手那样的按钮 如何根据IP段计算子网掩码? MFC单文档系统自带的打开对话框的源代码的问题
__in HDC hdc,
__in const BITMAPINFO *pbmi,//要创建的设备无关位图信息
__in UINT iUsage, // DIB_PAL_COLORS或者DIB_RGB_COLORS
__out VOID **ppvBits, //指向存储位图数据的内存地址,
__in HANDLE hSection,//NULL
__in DWORD dwOffset //0,文件偏移量
);
该函数创建一个设备无关位图,第四个参数就是位图的数据流指针。你充数据库里读出位图数据,可以传递给这个参数。第二参数需要初始化。
{
void* pBitsDib;
CBitmap* wrk_nBitmap;
CGdiObject* wrk_pGdiObject;
CDC wrk_cdcMem;
HBITMAP hBitmap;
HDC hdc; LPBITMAPINFO lpbmi = new BITMAPINFO;
ZeroMemory(lpbmi, sizeof(BITMAPINFO));
lpbmi-> bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
lpbmi-> bmiHeader.biPlanes = 1;
lpbmi-> bmiHeader.biCompression = BI_RGB;
lpbmi-> bmiHeader.biClrImportant = 0;
lpbmi-> bmiHeader.biSizeImage = 0;
lpbmi-> bmiHeader.biClrUsed = 0;
lpbmi-> bmiHeader.biBitCount = 24;
lpbmi-> bmiHeader.biWidth = srcWidth;
//lpbmi-> bmiHeader.biHeight = srcHeight;
lpbmi-> bmiHeader.biHeight = srcHeight*(-1);
lpbmi-> bmiHeader.biXPelsPerMeter= 0;
lpbmi-> bmiHeader.biYPelsPerMeter= 0; hdc = ::GetDC(NULL);
wrk_cdcMem.CreateCompatibleDC(NULL);
hBitmap = ::CreateDIBSection(NULL, lpbmi, DIB_RGB_COLORS, (void**)&pBitsDib, NULL, 0);
wrk_nBitmap = new CBitmap();
wrk_nBitmap->Attach(hBitmap);
wrk_pGdiObject = wrk_cdcMem.SelectObject(wrk_nBitmap); SetDIBits(wrk_cdcMem.GetSafeHdc(),hBitmap,0,srcHeight,pGradImg,lpbmi,DIB_RGB_COLORS); wrk_cdcMem.SelectObject(wrk_pGdiObject);
delete lpbmi;
wrk_cdcMem.DeleteDC();
if(hdc != NULL)
{
::ReleaseDC(NULL,hdc);
}
return wrk_nBitmap;
}
int GetDIBits
(
HDC hdc,
HBITMAP hbmp,
UINT uStartScan,
UINT cScanLines,
LPVOID lpvBits,
LPBITMAPINFO lpbi,
UINT uUsage
);
读取hbmp句柄所标识的位图的数据部分,以二进制流存在lpvbits中。这个内存指针要提前分配好。