1。jpeg在数据库中是否以二进制方式存储?
2。若是以二进制方式存储,读出时怎样在视图上显示?
我知道一种读数据库中位图的方法,读出来后显示是用CreateDIBitmap函数得到HBITMAP.但是显示jpeg又怎样做呢?? 还望哪位大虾指点,不甚感激!!
2。若是以二进制方式存储,读出时怎样在视图上显示?
我知道一种读数据库中位图的方法,读出来后显示是用CreateDIBitmap函数得到HBITMAP.但是显示jpeg又怎样做呢?? 还望哪位大虾指点,不甚感激!!
解决方案 »
- CDECL和_cdecl有什么不同以及为什么使用变参和_stdcall不出错?
- 求指教,VC的图形绘制问题
- 在对话框开始InitInstance()中加一个全局线程,GetSafeHwnd()有问题
- 怎么将JPG图片的原始信息(不含头信息)转换为byte类型的一维数组啊
- 对于MFC 内部怎样调用各个类很迷糊!!请达人指点小弟!
- char* 的作用?
- 如何创建一个从CBitmap类继承的类
- ahao接分!!!
- SCROLLINFO中的nPage变量干什么用的
- 关于VC调试
- 急!急!急!用vc如何把数据库中的jpeg文件读出并在视图中显示出来?
- 如何编程向EXCEL中写入数据?代码越详细越好,分不够可以再加。
这种用途应该是很广的啊。。
HRESULT hr;
HDC hdc;
char *pBuf;
VARIANT varBLOB;
VARIANT rgvValues;
BSTR Bstr1;
long lDataSize;
HGLOBAL hpalmem;
LPBITMAPINFO lpbmi;
LPLOGPALETTE lplogpal;
HPALETTE hpal;
const void *lpbit;
COleVariant rValueData;
hr=CoInitialize(NULL);
CString Constr,wCmdString,tempstr;
CComPtr<ADOField> pField;
if(FAILED(hr))
m_Conn = NULL;
m_Rec = NULL;
pFields = NULL;
hr = ::CoCreateInstance((REFCLSID)CLSID_CADOConnection,NULL,CLSCTX_INPROC_SERVER,\
(REFIID)IID_IADOConnection,(LPVOID*)&m_Conn);
if (FAILED(hr))
return ;
hr = ::CoCreateInstance((REFCLSID)CLSID_CADORecordset,NULL,CLSCTX_INPROC_SERVER,\
(REFIID)IID_IADORecordset,(LPVOID*)&m_Rec);
if (FAILED(hr))
return ;
tempstr="f:\\练习\\MyApp\\数据库\\oleado\\oleado.mdb";
Constr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+tempstr+";Persist Security Info=False";
hr = m_Conn->Open(CComBSTR(Constr),CComBSTR(""),CComBSTR(""),adOpenUnspecified);
if (FAILED(hr))
{
::AfxMessageBox("连接数据库错误!");
return ;
}
wCmdString=_T("select * from userphoto");//
hr = m_Rec->Open(CComVariant(wCmdString),CComVariant(m_Conn),adOpenKeyset,adLockOptimistic,adCmdText);
if (FAILED(hr))
{
::AfxMessageBox("打开表错误!");
return ;
}
m_Rec->get_Collect(CComVariant(1),rValueData);
Bstr1= (_bstr_t) rValueData;
m_UserName.Format("%s",(CString)Bstr1);
rValueData.Clear();
m_Rec->get_Collect(CComVariant(2),rValueData); ///为新记录填充username字段
m_UseOld=rValueData.intVal;
pField=NULL;
m_Rec->get_Fields(&pFields);//加入BLOB类型的数据
pFields->get_Item(CComVariant(3),&pField);
pField->get_ActualSize(&lDataSize);
// long lDataSize = m_Rec->GetFields()->GetItem("photo")->ActualSize;///得到数据的长度
if(lDataSize > 0)
{
rgvValues.vt = VT_ERROR;
rgvValues.scode = DISP_E_PARAMNOTFOUND;
// _variant_t varBLOB;
pField->GetChunk(lDataSize,&varBLOB);
if(varBLOB.vt == (VT_ARRAY | VT_UI1)) ///判断数据类型是否正确
{
SafeArrayAccessData(varBLOB.parray,(void **)&pBuf); ///得到指向数据的指针
/*****在这里我们可以对pBuf中的数据进行处理*****/
SafeArrayUnaccessData (varBLOB.parray);
}
}
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb);
LPVOID pvData = NULL;
if (hGlobal != NULL)
{
if ((pvData = GlobalLock(hGlobal)) != NULL)
{
file.ReadHuge(pvData, lDataSize );
GlobalUnlock(hGlobal);
CreateStreamOnHGlobal(hGlobal, TRUE, &pStm); if(SUCCEEDED(OleLoadPicture(pStm,fstatus.m_size,TRUE,IID_IPicture,(LPVOID*)&pPic)))
{
OLE_XSIZE_HIMETRIC hmWidth;
OLE_YSIZE_HIMETRIC hmHeight; pPic->get_Width(&hmWidth);
pPic->get_Height(&hmHeight); // double fX,fY;
// fX = (double)pDC->GetDeviceCaps(HORZRES)*(double)hmWidth/((double)pDC->GetDeviceCaps(HORZSIZE)*100.0);
// fY = (double)pDC->GetDeviceCaps(VERTRES)*(double)hmHeight/((double)pDC->GetDeviceCaps(VERTSIZE)*100.0);
// if(FAILED(pPic->Render(*pDC,0,0,(DWORD)fX,(DWORD)fY,0,hmHeight,hmWidth,-hmHeight,NULL)))
double fX,fY;
fX = 640;
fY = 480;
if(FAILED(pPic->Render(*pDC,0,0,(DWORD)fX,(DWORD)fY,0,hmHeight,hmWidth,-hmHeight,NULL))) AfxMessageBox("Failed To Render The picture!");
pPic->Release();
}
else
AfxMessageBox("Error Loading Picture From Stream!");
}
}
}
else
AfxMessageBox("Can't Open Image File!");这样就OK了 你试试
2.至于显示jpeg文件,那是个非常复杂的问题,因为里面牵涉到文件版本,图像解压等问题。一般来说需要第三方的软件。自己写是非常困难的。
>>file.ReadHuge(pvData, lDataSize );
file对象还未创建。此处编译不通。。
请把你的源代码发一份给我,很急!!
请把你的源代码发一份给我,很急!!