将CBitmap转换成char[] 大家好,我需要做这样一件事,就是将客户端的一个图片加载成为CBitmap类或者HBITMAP,现在我需要用一个char []数组将所有数据保存起来,然后在通过套接字发送到服务器端,在服务器端又将这个char []转换成 CBitmap 类或者HBITMAP。 请问,这怎么转换呢?就是将CBitmap/HBITMAP保存到一个char []中呢? 谢谢大家! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 HANDLE hImgFile = ::CreateFile(szImgFile,GENERIC_READ,0,NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,0);DWORD dwFileLength = ::GetFileSize(hImgFile ,NULL);//文件长度 CHAR *pszFileBuffer = NULL; pszFileBuffer = new CHAR[dwFileLength]; //读入源文件DWORD dwRead=0;ReadFile(hImgFile ,pszFileBuffer,dwFileLength,&dwRead,NULL) 回复1楼的,这个图片不是来自文件夹,否则我会自己读取的。现在这个图片保存在CBitmap/HBITMAP中,其实图片是对屏幕的截图,不是来自文件夹里面的 bool CProjectionDlg::GetImagePathData( char * &p , long &lImageLong )//获取文件的数据{ CFile file; //定义文件对象 if( !file.Open( m_szImagePath, CFile::modeRead ) ) //以只读方式打开文件 { MessageBox( _T("无法打开BMP文件,保存失败!"), _T("提示"), MB_OK | MB_OK | MB_ICONERROR ); return false; } DWORD filelen; //用于保存文件长度 filelen = (DWORD)file.GetLength(); //读取文件长度 p = new char[filelen + 1]; //根据文件长度分配数组空间 if(!p ) //如果不空间不足则返回 { file.Close(); MessageBox( _T("无法分配足够的内存空间,保存失败!"), _T("提示"), MB_OK | MB_OK | MB_ICONERROR ); return false; } if( file.Read( p, filelen ) != filelen ) //读取BMP文件到m_pBuffer中 { delete p; file.Close(); MessageBox( _T("读取文件时出现错误,保存失败!"), _T("提示"), MB_OK | MB_OK | MB_ICONERROR ); return false; } file.Close(); lImageLong = filelen; return true;}void CProjectionDlg::ImageDataToHBITMAP( char* &pData, HBITMAP *m_pHbitmap )//数据库的数据转为HBITMAP{ LPSTR hDIB; LPVOID lpDIBBits; BITMAPFILEHEADER bmfHeader; DWORD bmfHeaderLen; bmfHeaderLen = sizeof( bmfHeader); strncpy_s( (LPSTR)&bmfHeader, bmfHeaderLen, (LPSTR)pData, bmfHeaderLen ); hDIB = pData + bmfHeaderLen; BITMAPINFOHEADER &bmiHeader = *(LPBITMAPINFOHEADER)hDIB; BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB; lpDIBBits = pData + ((BITMAPFILEHEADER *)pData)->bfOffBits; CClientDC dc(this); *m_pHbitmap = CreateDIBitmap( dc.m_hDC, &bmiHeader, CBM_INIT, lpDIBBits, &bmInfo, DIB_RGB_COLORS ); delete pData;}以前做的一个项目代码,献给LZ啦,你试下行不。以前我是看这个http://www.360doc.com/content/11/0113/16/4780948_86256633.shtml学会的. 1.5TB 大容量硬盘的用途。 请问comboboxEx控件怎么不响应ctrl+V呀? 关于ADO连接数据库并写数据库CPU利用率的问题 vc中ADO访问远程access的一个连接问题 送分,谢谢 如何用C或C++或C#求得CPU序列号和硬盘物理序列号(不是硬盘分区序列号) 抓狂!看了几天了, CoCreateInstance总是出错!!!!救命啊! MFC中怎么使用按钮结束一个循环 如何将一个二进制文件写入移动存储设备的物理地址0x00,如U盘或读卡其中的SD卡中 消息传送的参数 怎么针对游戏杆编程???HELP??? 如何获得如图句柄? 键盘钩子中 怎么修改拦截到的消息?
FILE_ATTRIBUTE_NORMAL,0);
DWORD dwFileLength = ::GetFileSize(hImgFile ,NULL);//文件长度
CHAR *pszFileBuffer = NULL;
pszFileBuffer = new CHAR[dwFileLength]; //读入源文件
DWORD dwRead=0;
ReadFile(hImgFile ,pszFileBuffer,dwFileLength,&dwRead,NULL)
{
CFile file; //定义文件对象 if( !file.Open( m_szImagePath, CFile::modeRead ) ) //以只读方式打开文件
{
MessageBox( _T("无法打开BMP文件,保存失败!"), _T("提示"), MB_OK | MB_OK | MB_ICONERROR );
return false;
} DWORD filelen; //用于保存文件长度 filelen = (DWORD)file.GetLength(); //读取文件长度 p = new char[filelen + 1]; //根据文件长度分配数组空间 if(!p ) //如果不空间不足则返回
{
file.Close(); MessageBox( _T("无法分配足够的内存空间,保存失败!"), _T("提示"), MB_OK | MB_OK | MB_ICONERROR ); return false;
} if( file.Read( p, filelen ) != filelen ) //读取BMP文件到m_pBuffer中
{
delete p; file.Close(); MessageBox( _T("读取文件时出现错误,保存失败!"), _T("提示"), MB_OK | MB_OK | MB_ICONERROR ); return false;
} file.Close(); lImageLong = filelen; return true;
}void CProjectionDlg::ImageDataToHBITMAP( char* &pData, HBITMAP *m_pHbitmap )//数据库的数据转为HBITMAP
{
LPSTR hDIB; LPVOID lpDIBBits; BITMAPFILEHEADER bmfHeader; DWORD bmfHeaderLen; bmfHeaderLen = sizeof( bmfHeader); strncpy_s( (LPSTR)&bmfHeader, bmfHeaderLen, (LPSTR)pData, bmfHeaderLen ); hDIB = pData + bmfHeaderLen; BITMAPINFOHEADER &bmiHeader = *(LPBITMAPINFOHEADER)hDIB; BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB; lpDIBBits = pData + ((BITMAPFILEHEADER *)pData)->bfOffBits; CClientDC dc(this); *m_pHbitmap = CreateDIBitmap( dc.m_hDC, &bmiHeader, CBM_INIT, lpDIBBits, &bmInfo, DIB_RGB_COLORS ); delete pData;
}以前做的一个项目代码,献给LZ啦,你试下行不。以前我是看这个http://www.360doc.com/content/11/0113/16/4780948_86256633.shtml学会的.