VC保存和显示数据库图像(BMP)
源代码:下载
简述关键代码如下:
1、保存图片数据到数据库
//BMP图片保存到数据库
try
{
_RecordsetPtr pRecordset;
pRecordset.CreateInstance(__uuidof(Recordset));
pRecordset->Open("SELECT * FROM bmp",_variant_t((IDispatch*)pConnection),adOpenStatic,adLockOptimistic,adCmdText);
pRecordset->AddNew();
pRecordset->Fields->Item["bmpid"]->Value = (_variant_t)m_BMPId; //bmpid
VARIANT pvList;
SetPictureToVariant(pvList,(unsigned char *)m_pBMPBuffer);
pRecordset->Fields->Item["bmpimage"]->AppendChunk(pvList); //BMP图像文件
VariantClear(&pvList);
pRecordset->Update();
pRecordset->Close();
AfxMessageBox("BMP图像保存成功!");
}
catch(...)
{
AfxMessageBox("数据库读取失败");
return;
}
其中SetPictureToVariant如下:
void CBMPinDBDlg::SetPictureToVariant(VARIANT &pvList, unsigned char *sPicture)
{
SAFEARRAYBOUND saBound[1];
saBound[0].cElements = m_nFileLen;
saBound[0].lLbound = 0;
SAFEARRAY *pSA = SafeArrayCreate(VT_UI1, 1, saBound);
for (long l = 0; l < (long)m_nFileLen; l ++)
{
SafeArrayPutElement( pSA, &l, (void*)&sPicture[l]);
}
VariantClear(&pvList);
pvList.vt = VT_UI1 | VT_ARRAY;
pvList.parray = pSA;
}
2、从数据库读取图像文件并且显示在界面
//从数据库里取BMP图像文件
try
{
_RecordsetPtr pRecordset;
char sSql[129];
sprintf(sSql,"SELECT *FROM bmp WHERE bmpid='%s'",m_BMPId);
pRecordset.CreateInstance(__uuidof(Recordset));
pRecordset->Open(sSql,_variant_t((IDispatch*)pConnection),adOpenStatic,adLockOptimistic,adCmdText);
if (pRecordset->adoEOF)
{
CString str;
str.Format("没有BMPid为: %s 的BMP图像!",m_BMPId );
AfxMessageBox(str);
DestroyPhoto();
Invalidate();
m_BMPId = "";
UpdateData(false);
m_EidtBMPId.SetFocus();
return;
}
_variant_t pvList ;
long lDataSize = pRecordset->GetFields()->GetItem("bmpimage")->ActualSize;
m_nFileLen = (DWORD)lDataSize;
if(lDataSize > 0)
{
_variant_t varBLOB;
varBLOB = pRecordset->GetFields()->GetItem("bmpimage")->GetChunk(lDataSize);
//把二进制格式的图片转为图片格式
if(varBLOB.vt == (VT_ARRAY | VT_UI1))
{
if(m_pBMPBuffer = new char[lDataSize+1])
{
char *pBuf = NULL;
SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);
memcpy(m_pBMPBuffer,pBuf,lDataSize);
SafeArrayUnaccessData (varBLOB.parray);
m_nFileLen = lDataSize;
m_hBitmap = BufferToHBITMAP();
Invalidate();//在界面显示
}
}
}
}
catch(...)
{
AfxMessageBox("数据库读取失败");
return;
}
上次写了两篇关于在VC界面显示图片(BMP、JPG)的文章,但是并没有涉及到数据库,所以这次补写了这两篇有关数据库的文章,这两篇文章用的是access的数据库,其它的数据库操作道理是一样的。
具体的程序请参考附带的例子,例子里面有详细的注释。
版权声明: 本博客地址 http://www.cnblogs.com/joinclear,欢迎转载,转载请标明原文作者和链接。
文章说明: 一家之辞难免有误,欢迎您中肯的指正;如对您有帮助,不胜荣幸,但更希望能够抛砖引玉。
- joinclear
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库