小弟用了一个封装的ADO类访问MySQL数据库,在存8位灰度bmp图像文件时出现问题。
bmp文件的大小是2622518 Byte,可是存到数据库中却是2622644 Byte,多了126 byte. 再用数据库的客户端把字段存为文件,得到的图像和原图不同,高亮度区的颜色变成了黄色,左侧一窄条上下颠倒显示,这是怎么回事呢?请高手帮忙分析分析,多谢多谢!附相关部分源代码:
加载BMP文件到内存:
CFile file;
file.Open( pBMPPathname, CFile::modeRead) )
m_nFileLen = file.GetLength();
m_pBMPBuffer = new BYTE[m_nFileLen + 1];
写入数据库:
CADORecordset newSet(&m_DB);
newSet.AppendChunk("data",m_pBMPBuffer, m_nFileLen);
ADO类函数:
BOOL CADORecordset::AppendChunk(LPCTSTR lpFieldName, LPVOID lpData, UINT nBytes)
{ FieldPtr pField = m_pRecordset->Fields->GetItem(lpFieldName); return AppendChunk(pField, lpData, nBytes);
}BOOL CADORecordset::AppendChunk(FieldPtr pField, LPVOID lpData, UINT nBytes)
{
HRESULT hr;
_variant_t varChunk;
long lngOffset = 0;
UCHAR chData;
SAFEARRAY FAR *psa = NULL;
SAFEARRAYBOUND rgsabound[1]; try
{
//Create a safe array to store the array of BYTES
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = nBytes;
psa = SafeArrayCreate(VT_UI1,1,rgsabound);
while(lngOffset < (long)nBytes)
{
chData = ((UCHAR*)lpData)[lngOffset];
hr = SafeArrayPutElement(psa, &lngOffset, &chData); if(FAILED(hr))
return FALSE;
lngOffset++;
}
lngOffset = 0; //Assign the Safe array to a variant.
varChunk.vt = VT_ARRAY|VT_UI1;
varChunk.parray = psa; hr = pField->AppendChunk(varChunk); if(SUCCEEDED(hr))
return TRUE;
}
catch(_com_error &e)
{
dump_com_error(e);
return FALSE;
} return FALSE;
}
bmp文件的大小是2622518 Byte,可是存到数据库中却是2622644 Byte,多了126 byte. 再用数据库的客户端把字段存为文件,得到的图像和原图不同,高亮度区的颜色变成了黄色,左侧一窄条上下颠倒显示,这是怎么回事呢?请高手帮忙分析分析,多谢多谢!附相关部分源代码:
加载BMP文件到内存:
CFile file;
file.Open( pBMPPathname, CFile::modeRead) )
m_nFileLen = file.GetLength();
m_pBMPBuffer = new BYTE[m_nFileLen + 1];
写入数据库:
CADORecordset newSet(&m_DB);
newSet.AppendChunk("data",m_pBMPBuffer, m_nFileLen);
ADO类函数:
BOOL CADORecordset::AppendChunk(LPCTSTR lpFieldName, LPVOID lpData, UINT nBytes)
{ FieldPtr pField = m_pRecordset->Fields->GetItem(lpFieldName); return AppendChunk(pField, lpData, nBytes);
}BOOL CADORecordset::AppendChunk(FieldPtr pField, LPVOID lpData, UINT nBytes)
{
HRESULT hr;
_variant_t varChunk;
long lngOffset = 0;
UCHAR chData;
SAFEARRAY FAR *psa = NULL;
SAFEARRAYBOUND rgsabound[1]; try
{
//Create a safe array to store the array of BYTES
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = nBytes;
psa = SafeArrayCreate(VT_UI1,1,rgsabound);
while(lngOffset < (long)nBytes)
{
chData = ((UCHAR*)lpData)[lngOffset];
hr = SafeArrayPutElement(psa, &lngOffset, &chData); if(FAILED(hr))
return FALSE;
lngOffset++;
}
lngOffset = 0; //Assign the Safe array to a variant.
varChunk.vt = VT_ARRAY|VT_UI1;
varChunk.parray = psa; hr = pField->AppendChunk(varChunk); if(SUCCEEDED(hr))
return TRUE;
}
catch(_com_error &e)
{
dump_com_error(e);
return FALSE;
} return FALSE;
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货