分享

读写Access表中的图像字段

 源码无限 2012-12-29
Access中的图像字段使用二进制存储(OLE对象);
存储时,获取图像的二进制信息,写入Access,但插入Access表中的字段类型为_variant_t,所以需要转换,如下;
_variant_t ImgBufferToVar(BYTE* pBuffer,const int& nLen)
{
_variant_t varPic;//该对象用于存放位图信息
varPic.vt = VT_NULL;
BYTE* buff = pBuffer;
SAFEARRAY *safeArray;//定义一个SAFEARRAY结构对象
SAFEARRAYBOUND rgsabound[1];//此结构体用来定义SAFEARRAY的边界
if(buff)//判断位图文件是否为空
{
//int nLen = sizeof(buff)/sizeof(char*);
rgsabound[0].lLbound=0;//定义下界
rgsabound[0].cElements=nLen;//定义上限
safeArray=SafeArrayCreate(VT_UI1,1,rgsabound);// 使用SafeArrayCreate在堆上创建一维数组
for(long i=0;i<(long)nLen;i++)
{
SafeArrayPutElement(safeArray,&i,buff++);//传值
}
varPic.vt=VT_ARRAY|VT_UI1;//把值给VARIANT对象
varPic.parray=safeArray; //把值给VARIANT对象
}
return varPic;
}
然后————
pRecordset->GetFields()->GetItem(varField)->AppendChunk(varValue);
这样就完成了写入;

如何读取Access表中的图像字段,原理也是一样的:
首先获取存储在表中图像的二进制信息,然后把二进制信息写入图像文件(比如bmp),就得到图像了;
BYTE* CLiboProcessImage::VarToImgBuffer(const _variant_t& var,const int& nBufferLen)
{
BYTE* pBuffer = NULL;
if(var.vt==(VT_ARRAY|VT_UI1))
{
pBuffer = new BYTE[nBufferLen + 1];
BYTE *buff;
SafeArrayAccessData(var.parray,(void**)&buff); //把位图数据放到buff中去
memcpy(pBuffer,buff,nBufferLen); //把位图数据放到pBuff中
BITMAPFILEHEADER *pbh = (BITMAPFILEHEADER *)pBuffer;
SafeArrayUnaccessData(var.parray); //释放
}
return pBuffer;
}
过程如下:
先获取字段数据(_variant_t类型),然后通过上面函数转为Byte*类型,就ok了;nBufferLen通过
nBufferLen = pRecordset->GetFields()->GetItem(L"图像列名")->ActualSize;

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多