怎样可以把图片转换成数据格式存储,并再把这数据格式在界面中再显示成图片? 怎样可以把图片转换成数据格式存储,并再把这数据格式在界面中再显示成图片。谢谢!可能会用到CreateDIBitmap和SetBitmap等函数。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 WINDOWS的窗口图像从本质上来说,是WINDOWS在内存DC上绘制的一幅图像, 我们要将此图像存储起来,首先要获得WINDOWS窗口的区域大小,然后将区域中的图像 存在一内存DC中,由于内存DC是与设备相关的位图,所以将它存储起来还要用DDBTODIB 函数转换成DIB位图,最后再用WriteDIB函数转储成BMP文件。 BOOL WriteWindowToDIB( LPTSTR szFile, CWnd *pWnd ) { CBitmap bitmap; CWindowDC dc(pWnd); CDC memDC; CRect rect; memDC.CreateCompatibleDC(&dc); pWnd-> GetWindowRect(rect); //用窗口区域大小定义一个内存DC ,并将窗口图像暂存其中 bitmap.CreateCompatibleBitmap(&dc, rect.Width(),rect.Height() ); CBitmap* pOldBitmap = memDC.SelectObject(&bitmap); memDC.BitBlt(0, 0, rect.Width(),rect.Height(), &dc, 0, 0, SRCCOPY); // 如果设备支持调色板,创建调色板 CPalette pal; if( dc.GetDeviceCaps(RASTERCAPS) & RC_PALETTE ) { UINT nSize = sizeof(LOGPALETTE) + (sizeof(PALETTEENTRY) * 256); LOGPALETTE *pLP = (LOGPALETTE *) new BYTE[nSize]; pLP-> palVersion = 0x300; pLP-> palNumEntries = GetSystemPaletteEntries( dc, 0, 255, pLP-> palPalEntry ); // Create the palette pal.CreatePalette( pLP ); delete[] pLP; } memDC.SelectObject(pOldBitmap); // 转换 bitmap 到 a DIB HANDLE hDIB = DDBToDIB( bitmap, BI_RGB, &pal ); if( hDIB == NULL ) return FALSE; // Write it to file WriteDIB( szFile, hDIB ); // Free the memory allocated by DDBToDIB for the DIB GlobalFree( hDIB ); return TRUE; } 保存图片是这样,通过读取文件CFile file; //定义文件对象 if( !file.Open( m_szImagePath, CFile::modeRead ) ) //以只读方式打开文件 { MessageBox( _T("无法打开BMP文件,保存失败!"), _T("提示"), MB_OK | MB_OK | MB_ICONERROR ); return false; }保存到一个Char数组里.之后你想保存到那里的话就把CHAR放到哪里,不过我就一般放在ACCESS而这数据格式在界面中再显示成图片,则双是读取你保存的CHAR数组,再oid CProjectionDlg::ImageDataToHBITMAP( char* &pData )//数据库的数据转为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); HBITMAP m_hBmp = CreateDIBitmap( dc.m_hDC, &bmiHeader, CBM_INIT, lpDIBBits, &bmInfo, DIB_RGB_COLORS );}HBITMAP有了之后,你应该能显示的啦 http://blog.csdn.net/morbi/article/details/5674687 可以用opencv试试,保存成xml格式,存储和读取都很方便 void CGdiplusTestDoc::Serialize(CArchive& ar){ if (ar.IsStoring()) { // TODO: add storing code here HGLOBAL m_hMem = GlobalAlloc(GMEM_MOVEABLE, 0); IStream *pstm=NULL; CreateStreamOnHGlobal(m_hMem, TRUE, &pstm); CLSID clsid; USES_CONVERSION; GetCodecClsid(A2W("image/jpeg"), &clsid); m_pImage->Save(pstm,&clsid,NULL); if (pstm==NULL) return; LARGE_INTEGER liBeggining = { 0 }; pstm->Seek(liBeggining, STREAM_SEEK_SET, NULL); DWORD wTemp=GlobalSize(m_hMem); LPBYTE lpData = (LPBYTE)GlobalLock(m_hMem); ar << wTemp; ar.Write(lpData,wTemp); pstm->Release(); GlobalUnlock(m_hMem); } else { // TODO: add loading code here DWORD wTemp; ar >> wTemp; HGLOBAL m_hMem = GlobalAlloc(GMEM_FIXED, wTemp); if (m_hMem == NULL) return; IStream *pstm=NULL; CreateStreamOnHGlobal(m_hMem,FALSE,&pstm); if (pstm==NULL) return; BYTE* pmem = (BYTE*)GlobalLock(m_hMem); ar.Read(pmem,wTemp); if (m_pImage) { delete m_pImage; m_pImage = NULL; } using namespace Gdiplus; if (m_pImage!=NULL) { delete m_pImage; m_pImage=NULL; } m_pImage = Image::FromStream(pstm, FALSE); pstm->Release(); GlobalUnlock(m_hMem); }}这段代码是将图片串行化,然后还原。可以参考一下。m_pImage是Image类型,参考gdi+,你也可以不用Gdi+,CImage也提供了save功能, 求简单的话,可以直接CxImage搞定 vs2008 做播放器 中Windows Media Player 控件问题 (全过程演示~) 郁闷,回答问题居然被人说成无聊.我日. 问一个关于VS2005编码时的智能感知的问题。 求助高人指导列表视图、列表控件、列表框控件的用法 如何用位组成字节的问题! 送分问题:怎么实现窗体最小化时隐藏? 谁有RTP Library 源代码?或者和RTP/RTCP相关的资料 为何提示? 各位大哥帮帮小弟,谁给出源代码,分一定给足,谢谢了! 组件聚合的实现问题 VC工程里能直接导入EXE文件到资源里,然后再生成我自己的EXE吗? 求助 关于恢复DeleteVolumeMountPoint删除的U盘盘符
我们要将此图像存储起来,首先要获得WINDOWS窗口的区域大小,然后将区域中的图像
存在一内存DC中,由于内存DC是与设备相关的位图,所以将它存储起来还要用DDBTODIB
函数转换成DIB位图,最后再用WriteDIB函数转储成BMP文件。
BOOL WriteWindowToDIB( LPTSTR szFile, CWnd *pWnd )
{
CBitmap bitmap;
CWindowDC dc(pWnd);
CDC memDC;
CRect rect; memDC.CreateCompatibleDC(&dc); pWnd-> GetWindowRect(rect);
//用窗口区域大小定义一个内存DC ,并将窗口图像暂存其中
bitmap.CreateCompatibleBitmap(&dc, rect.Width(),rect.Height() ); CBitmap* pOldBitmap = memDC.SelectObject(&bitmap);
memDC.BitBlt(0, 0, rect.Width(),rect.Height(), &dc, 0, 0, SRCCOPY); // 如果设备支持调色板,创建调色板
CPalette pal;
if( dc.GetDeviceCaps(RASTERCAPS) & RC_PALETTE )
{
UINT nSize = sizeof(LOGPALETTE) + (sizeof(PALETTEENTRY) * 256);
LOGPALETTE *pLP = (LOGPALETTE *) new BYTE[nSize];
pLP-> palVersion = 0x300; pLP-> palNumEntries =
GetSystemPaletteEntries( dc, 0, 255, pLP-> palPalEntry ); // Create the palette
pal.CreatePalette( pLP ); delete[] pLP;
} memDC.SelectObject(pOldBitmap); // 转换 bitmap 到 a DIB
HANDLE hDIB = DDBToDIB( bitmap, BI_RGB, &pal ); if( hDIB == NULL )
return FALSE; // Write it to file
WriteDIB( szFile, hDIB ); // Free the memory allocated by DDBToDIB for the DIB
GlobalFree( hDIB );
return TRUE;
}
CFile file; //定义文件对象 if( !file.Open( m_szImagePath, CFile::modeRead ) ) //以只读方式打开文件
{
MessageBox( _T("无法打开BMP文件,保存失败!"), _T("提示"), MB_OK | MB_OK | MB_ICONERROR );
return false;
}
保存到一个Char数组里.之后你想保存到那里的话就把CHAR放到哪里,不过我就一般放在ACCESS而这数据格式在界面中再显示成图片,则双是读取你保存的CHAR数组,再
oid CProjectionDlg::ImageDataToHBITMAP( char* &pData )//数据库的数据转为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); HBITMAP m_hBmp = CreateDIBitmap( dc.m_hDC, &bmiHeader, CBM_INIT, lpDIBBits, &bmInfo, DIB_RGB_COLORS );
}HBITMAP有了之后,你应该能显示的啦
void CGdiplusTestDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: add storing code here
HGLOBAL m_hMem = GlobalAlloc(GMEM_MOVEABLE, 0);
IStream *pstm=NULL;
CreateStreamOnHGlobal(m_hMem, TRUE, &pstm);
CLSID clsid;
USES_CONVERSION;
GetCodecClsid(A2W("image/jpeg"), &clsid);
m_pImage->Save(pstm,&clsid,NULL);
if (pstm==NULL)
return;
LARGE_INTEGER liBeggining = { 0 };
pstm->Seek(liBeggining, STREAM_SEEK_SET, NULL);
DWORD wTemp=GlobalSize(m_hMem);
LPBYTE lpData = (LPBYTE)GlobalLock(m_hMem);
ar << wTemp;
ar.Write(lpData,wTemp);
pstm->Release();
GlobalUnlock(m_hMem);
}
else
{
// TODO: add loading code here
DWORD wTemp;
ar >> wTemp;
HGLOBAL m_hMem = GlobalAlloc(GMEM_FIXED, wTemp);
if (m_hMem == NULL)
return;
IStream *pstm=NULL;
CreateStreamOnHGlobal(m_hMem,FALSE,&pstm);
if (pstm==NULL)
return;
BYTE* pmem = (BYTE*)GlobalLock(m_hMem);
ar.Read(pmem,wTemp);
if (m_pImage) {
delete m_pImage;
m_pImage = NULL;
}
using namespace Gdiplus;
if (m_pImage!=NULL)
{
delete m_pImage;
m_pImage=NULL;
}
m_pImage = Image::FromStream(pstm, FALSE);
pstm->Release();
GlobalUnlock(m_hMem);
}
}
这段代码是将图片串行化,然后还原。可以参考一下。m_pImage是Image类型,参考gdi+,你也可以不用Gdi+,CImage也提供了save功能,