怎样可以把图片转换成数据格式存储,并再把这数据格式在界面中再显示成图片?

czydxj 2011-08-20 09:26:19
怎样可以把图片转换成数据格式存储,并再把这数据格式在界面中再显示成图片。谢谢!
可能会用到CreateDIBitmap和SetBitmap等函数。
...全文
459 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
czydxj 2011-08-23
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 buyong 的回复:]
说实话我没看懂?把图片转换成数据格式存储,难道你的图片原来是模拟信号?

引用 6 楼 czydxj 的回复:
怎样可以把图片转换成数据格式存储,并再把这数据格式在界面中再显示成图片。
我用的是vc6,请大家再多帮帮忙!
[/Quote]
我说的可能没说清楚,在网络传送图片或视频时可能是以一种数据格式来传送的,接收过来后再将这个图片数据格式显示成图片这样一个过程。所以我想了解怎样可以把图片转换成数据格式存储,并再把这数据格式在界面中再显示成图片。
大家在实际应用中有没有更好的方法?谢谢!
tzxx 2011-08-22
  • 打赏
  • 举报
回复
求简单的话,可以直接CxImage搞定
buyong 2011-08-22
  • 打赏
  • 举报
回复
说实话我没看懂?把图片转换成数据格式存储,难道你的图片原来是模拟信号?
[Quote=引用 6 楼 czydxj 的回复:]
怎样可以把图片转换成数据格式存储,并再把这数据格式在界面中再显示成图片。
我用的是vc6,请大家再多帮帮忙!
[/Quote]
hnzlk 2011-08-22
  • 打赏
  • 举报
回复

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功能,
czydxj 2011-08-22
  • 打赏
  • 举报
回复
怎样可以把图片转换成数据格式存储,并再把这数据格式在界面中再显示成图片。
我用的是vc6,请大家再多帮帮忙!
QQ515311445 2011-08-20
  • 打赏
  • 举报
回复
你是不想在加载图片的时候再次解码吧
zyrr159487 2011-08-20
  • 打赏
  • 举报
回复
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;
}
fengbingchun 2011-08-20
  • 打赏
  • 举报
回复
可以用opencv试试,保存成xml格式,存储和读取都很方便
叶恭介叶恭介 2011-08-20
  • 打赏
  • 举报
回复
保存图片是这样,通过读取文件
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有了之后,你应该能显示的啦

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧