直接是肯定不行的
因为picturebox的数据并非是图片的二进制数据
间接的话,你必须清楚了解picturebox的数据构成
然后用RS对象的取二进制方法取得图片的二进制数据
再转换为PICTUREBOX兼容格式的数据
假如完全使用API的话,速度不会太慢
因为picturebox的数据并非是图片的二进制数据
间接的话,你必须清楚了解picturebox的数据构成
然后用RS对象的取二进制方法取得图片的二进制数据
再转换为PICTUREBOX兼容格式的数据
假如完全使用API的话,速度不会太慢
1、取得图片字段的内存句柄
2、锁定内存,获得内存指针
3、找到内存指针指向区域中的第一个BM标记
4、取得BMP文件的头信息,得到文件的字节数
5、写文件
BOOL CC100ToCJKDlg::WriteImg(CRecordset &rs, LPCSTR sFieldByName, LPCSTR sDirByName)
{
CDBVariant dbv1;
dbv1.Clear();
rs.GetFieldValue (sFieldByName,dbv1,DEFAULT_FIELD_TYPE );
char * pBmpBuff=(char *)GlobalLock(dbv1.m_pbinary->m_hData);
GlobalUnlock(dbv1.m_pbinary->m_hData);
if (dbv1.m_pbinary->m_dwDataLength > sizeof(tagBITMAPFILEHEADER))
{
UINT i;
for ( i=0;i < dbv1.m_pbinary->m_dwDataLength;i++)
{
if ((pBmpBuff[i]=='B') &&(pBmpBuff[i+1]=='M'))
break;
}
pBmpBuff +=i;
tagBITMAPFILEHEADER tHead;
memcpy(&tHead,pBmpBuff,sizeof(tagBITMAPFILEHEADER));
CFile ff;
char szBuff[MAX_PATH];
memset(szBuff,0,MAX_PATH);
sprintf(szBuff,"%s\\%05d\\.",sDirByName,atol((LPCSTR)m_superno)/1000+1);
if (_access(szBuff,00) !=0)
{
sprintf(szBuff,"%s\\%05d",sDirByName,atol((LPCSTR)m_superno)/1000+1);
_mkdir(szBuff);
} sprintf(szBuff,"%s\\%05d\\%s.bmp",sDirByName,atol((const char *)m_superno)/1000+1,(const char *)m_superno);
ff.Open(szBuff,CFile::modeCreate and CFile::modeWrite);
ff.Write(pBmpBuff,tHead.bfSize);
ff.Flush();
ff.Close();
return TRUE;
}
else
{
return FALSE;
}
}
储存:
1.开一个备注型的字段.
2.把图片用文件函数直接打开,把全部文件读进字段.读取:
1.建一个空的临时文件
2.把备注型字段的数据全部写进去
3.直接把临时的文件赋予图片框.在vb可以建一个imagelist,在运行时直接用代码把图片加进imagelist,再赋予图片框.
如果你的E文足够应付的话!
论文号是:
Q147727,Q103115,Q1532238
看过也许有启发!
getchunk
setchunk
将数据追加到大型文本、二进制数据 Field 或 Parameter 对象。GetChunk 方法 (ADO)
返回大型文本或二进制数据 Field 对象的全部或部分内容。