打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
将图片保存在access数据库的问题(vc)
定义了一个以CObject为基类的CDib类(CDaoRecordView的派生类里定义了CDib对象成员m_DIB),其中包括一下成员和方法:
CByteArray m_bufDIB;
BOOL Create(CByteArray& ba);
BOOL Create(CFile& bmpFile);
BOOL Paint(HDC hDC);
----m_bufDIB是存储位图数据的缓冲区。为简便起见,它不包含包装信息和BITMAPFILEHEADER结构。这样对数据库更新后,原有的“OLE对象”类型将变成“长二进制数据”,不能在ACCESS里查看了。
----第一个Create()重载方法的参数ba是记录集的位图数据(比如m_image),使用CByteArray::Copy()把数据复制给m_bufDIB;第二个Create()方法的参数bmpFile是已打开的位图文件,使用CFile::ReadHuge()把文件里的数据读入m_bufDIB(放弃前面的BITMAPFILEHEADER结构):
DWORDdwBufSize;
dwBufSize=bmpFile.GetLength();//获得文件长度
bmpFile.Seek((long)sizeof(BITMAPFILEHEADER),
CFile::begin);//放弃文件头
dwBufSize-=sizeof(BITMAPFILEHEADER);
m_bufDIB.SetSize(dwBufSize);//设置缓冲区大小
file.ReadHuge((LPSTR)(m_bufDIB.GetData()),dwBufSize);
……
----Paint()方法调用了SetDIBitsToDevice()函数(根据情况也可以使用StretchDIBits()),参数hDC是CDaoRecordview的资源中的一个静态控制的设备句柄,作为SetDIBitsToDevice()的第一个参数。如果不是16或24位的位图,还需要建立和设置调色板。Paint()方法除了在CDaoRecordView派生类的OnMove()里调用外,也被OnPaint()调用(最好不在OnDraw()里调用):
void CDerivedView::OnPaint()
{
CPaintDC dc(this);
CClientDC dc1(&m_ctlImage);
if(m_DIB.Create(m_pSet->m_image))
m_DIB.Paint(dc1.m_hDC);
}
----首先采用的方法是,每当打开一个位图文件,调用m_DIB.Create()和m_DIB.Paint(),然后复制给m_pSet->m_image,再设置“脏”标识:
if(m_DIB.Create(bmpFile))
{
CClientDC dc(&m_ctlImage);
m_DIB.Paint(dc.m_hDC);
(m_pSet->m_image).Copy(m_DIB.m_bufDIB);
SetFieldDirty(&(m_pSet->m_image));
}
----记录滚动时,OnMove()调用Update()对数据进行更新。
----但是这样做的结果是,只有在域的内容不为空(NULL)的时候才能更新数据。也就是说,添加“长二进制数据”不能实现。
----发现使用SeieldValue()可以实现添加和替换。但由于未知的原因,还需要把另外某个域设置为“脏”才行:
if(m_DIB.Create(bmpFile))
{
CClientDC dc(&m_ctlImage);
m_DIB.Paint(dc.m_hDC);
(m_pSet->m_image).Copy(m_DIB.m_bufDIB);
// 只 为OnPaint() 调 用 时 使 用
m_pSet->SetFieldValue(_T("[image]"),
COleVariant(m_DIB.m_bufDIB));
m_pSet->SetFieldDirty(&(m_pSet->m_name));
// 任 意 另 外 一 个 域
}
----如果打算删除数据库里的位图数据,可以把一个“空”的CByteArray对象替换原来的就行了。

我觉得还是把图片放在一个文件夹里. 数据库里面只记地址  这样会好一些. 呵呵  不然的话图片转成数据 存取很占时间 ,把图片转换成二进制把转换后的二进制存如数据库(ASP,ASP.NET和其他动态网页编辑语言都可以实现)
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
用VB写高效的图像处理程序
DX中抓拍GetCurrentImage的用法
一个RTF的文本流,如何在一个普通的视图上DRAW出来?
Visual C++中DDB与DIB位图编程全攻略
BMP文件详解
vs2010基于MFC位图打开显示保存
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服