C++怎么把图片数据写入内存,有例子的发hp_hear@一六三点com
答案:3 悬赏:50 手机版
解决时间 2021-01-21 04:24
- 提问者网友:雪舞兮
- 2021-01-20 20:43
C++怎么把图片数据写入内存,有例子的发hp_hear@一六三点com
最佳答案
- 五星知识达人网友:几近狂妄
- 2021-01-20 21:38
我以前写的一个文件-》内存-》数据库
数据库-》内存-》控件的代码,希望对你有帮助。
读入内存的varBLOB
void CMyBlobData::GetBlobFromFile(_variant_t& varBLOB,CString fileName)
{
_StreamPtr pStm;
pStm.CreateInstance("ADODB.Stream");
variant_t varOptional(DISP_E_PARAMNOTFOUND,VT_ERROR);
pStm->PutType(adTypeBinary);
pStm->Open( varOptional,adModeUnknown, adOpenStreamUnspecified, _bstr_t(), _bstr_t());
pStm->LoadFromFile(_bstr_t(fileName));//读入文件
varBLOB=pStm->Read(adReadAll);
pStm->Close();
}
// 在指定区域显示照片
void CDyInput::ShowPic(CDC* pDC, CRect rect)
{
if(m_varBLOB.vt==VT_EMPTY)
{
pDC->FillSolidRect(rect.left ,rect.top ,rect.Width(),rect.Height(), GetSysColor(COLOR_3DFACE));
return;
}
HGLOBAL hGlobal=GlobalAlloc(GMEM_MOVEABLE,m_varBlobSize);
LPVOID pvData=NULL;
IStream* ps;
if(hGlobal!=NULL)
{
if((pvData = GlobalLock(hGlobal)) != NULL) //锁定内存分配块
{
char* pBuf=NULL;
SafeArrayAccessData(m_varBLOB.parray,(void **)&pBuf);
memcpy(pvData,pBuf,m_varBlobSize); //复制varBLOB中的数据到缓冲区
SafeArrayUnaccessData (m_varBLOB.parray);
GlobalUnlock(hGlobal);
CreateStreamOnHGlobal(hGlobal, TRUE, &ps);
}
}
IPicture* pPic;//装入图形数据
if(SUCCEEDED (OleLoadPicture(ps,m_varBlobSize,TRUE,IID_IPicture,(LPVOID*) &pPic)))
{
OLE_XSIZE_HIMETRIC hmWidth;//图片真实宽度
OLE_YSIZE_HIMETRIC hmHeight;//图片真实高度
pPic->get_Width(&hmWidth);
pPic->get_Height(&hmHeight);
if(FAILED(pPic->Render(*pDC,rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,0,hmHeight,hmWidth,-hmHeight,&rect)))
AfxMessageBox(_T("图像绘制失败!"));
pPic->Release();
}
}
显示图片
void CDyInput::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
if(nIDCtl==IDC_PIC_ZHAOPIAN && m_varBlobSize>0)
{
CDC dc;
dc.Attach(lpDrawItemStruct->hDC);//得到DC
CRect rect=lpDrawItemStruct->rcItem;//得到显示的区域
ShowPic(&dc,rect);
dc.Detach();
}
else
CDialogEx::OnDrawItem(nIDCtl, lpDrawItemStruct);
}追问谢谢你的回复,有具体的代码吗?直接复制你的代码的话会有很多错误追答父类也是用我的?要改成你自己的追问我只有一个类,提示很多未定义的错
数据库-》内存-》控件的代码,希望对你有帮助。
读入内存的varBLOB
void CMyBlobData::GetBlobFromFile(_variant_t& varBLOB,CString fileName)
{
_StreamPtr pStm;
pStm.CreateInstance("ADODB.Stream");
variant_t varOptional(DISP_E_PARAMNOTFOUND,VT_ERROR);
pStm->PutType(adTypeBinary);
pStm->Open( varOptional,adModeUnknown, adOpenStreamUnspecified, _bstr_t(), _bstr_t());
pStm->LoadFromFile(_bstr_t(fileName));//读入文件
varBLOB=pStm->Read(adReadAll);
pStm->Close();
}
// 在指定区域显示照片
void CDyInput::ShowPic(CDC* pDC, CRect rect)
{
if(m_varBLOB.vt==VT_EMPTY)
{
pDC->FillSolidRect(rect.left ,rect.top ,rect.Width(),rect.Height(), GetSysColor(COLOR_3DFACE));
return;
}
HGLOBAL hGlobal=GlobalAlloc(GMEM_MOVEABLE,m_varBlobSize);
LPVOID pvData=NULL;
IStream* ps;
if(hGlobal!=NULL)
{
if((pvData = GlobalLock(hGlobal)) != NULL) //锁定内存分配块
{
char* pBuf=NULL;
SafeArrayAccessData(m_varBLOB.parray,(void **)&pBuf);
memcpy(pvData,pBuf,m_varBlobSize); //复制varBLOB中的数据到缓冲区
SafeArrayUnaccessData (m_varBLOB.parray);
GlobalUnlock(hGlobal);
CreateStreamOnHGlobal(hGlobal, TRUE, &ps);
}
}
IPicture* pPic;//装入图形数据
if(SUCCEEDED (OleLoadPicture(ps,m_varBlobSize,TRUE,IID_IPicture,(LPVOID*) &pPic)))
{
OLE_XSIZE_HIMETRIC hmWidth;//图片真实宽度
OLE_YSIZE_HIMETRIC hmHeight;//图片真实高度
pPic->get_Width(&hmWidth);
pPic->get_Height(&hmHeight);
if(FAILED(pPic->Render(*pDC,rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,0,hmHeight,hmWidth,-hmHeight,&rect)))
AfxMessageBox(_T("图像绘制失败!"));
pPic->Release();
}
}
显示图片
void CDyInput::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
if(nIDCtl==IDC_PIC_ZHAOPIAN && m_varBlobSize>0)
{
CDC dc;
dc.Attach(lpDrawItemStruct->hDC);//得到DC
CRect rect=lpDrawItemStruct->rcItem;//得到显示的区域
ShowPic(&dc,rect);
dc.Detach();
}
else
CDialogEx::OnDrawItem(nIDCtl, lpDrawItemStruct);
}追问谢谢你的回复,有具体的代码吗?直接复制你的代码的话会有很多错误追答父类也是用我的?要改成你自己的追问我只有一个类,提示很多未定义的错
全部回答
- 1楼网友:低音帝王
- 2021-01-20 23:23
把图片显示出来
- 2楼网友:第四晚心情
- 2021-01-20 22:28
C++本身不提供吧
系统有加载图片和接口,你可以调用这些接口加载图片
系统有加载图片和接口,你可以调用这些接口加载图片
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯