将图片保存到数据库?

DailyJob 2008-09-10 01:28:34
我想用fwrite将一张图片保存到数据库中, 但不太清楚fwrite的参数意思,
fwrite的第二个参数是做什么的?下面这段代码没有保存成功,是哪里的问题?

typedef struct
{
UINT uImageLen; unsigned char *pbyImage;
}PIC,*PPIC;

FILE* fp = fopen("C:\\Documents and Settings\\Administrator\\My Documents\\My Pictures\\cc.jpg", "wb");
if (fp)
{
PPIC pPic;
fwrite(pPic->pbyImage, 1, pPic->uImageLen, fp);
fclose(fp);
}else
AfxMessageBox("error");
...全文
209 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
aiangela 2008-09-10
  • 打赏
  • 举报
回复
关注中~
菜牛 2008-09-10
  • 打赏
  • 举报
回复
看来PPIC是一个指针类型,你没有为其分配内存就使用了,当然错误。
DailyJob 2008-09-10
  • 打赏
  • 举报
回复
warning C4700: local variable 'pPic' used without having been initialized
这是什么原因?
DailyJob 2008-09-10
  • 打赏
  • 举报
回复
我想用 pPic->pbyImage 来保存图片数据,但不知道这样写是不是正确的
再改一下
typedef struct 
{
UINT uImageLen;
unsigned char *pbyImage;
}PIC,*PPIC;

FILE* fp = fopen("C:\\Documents and Settings\\Administrator\\My Documents\\My Pictures\\cc.jpg", "wb");
if (fp)
{
PPIC pPic;
fseek(fp, 0, 2);
pPic->uImageLen = ftell(fp);
pPic->pbyImage = new unsigned char(pPic->uImageLen);
fwrite(pPic->pbyImage, 1, pPic->uImageLen, fp);
fclose(fp);
}else
AfxMessageBox("error");

这样是否能写入正确呢?
mycool2001 2008-09-10
  • 打赏
  • 举报
回复
弄的我不明白了,pPic 既然是无效的你怎么写入文件中呢?
DailyJob 2008-09-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 mycool2001 的回复:]
第2个参数是 一次写入的大小 第3个参数是写入的数量
总大小 = 一次写入的大小 * 写入的数量

没有写入成功,pPic->uImageLen 是有效的数据吗?
[/Quote]
不是. .pPic->uImageLen 还没初始化
pbyImage是否也需要new一个空间出来存储图片数据呢?
第二个参数 一次写入的大小 ? 图片一次写入的数据多少合适?
DailyJob 2008-09-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 VsirSoft 的回复:]
C/C++ code读取:
1、从数据库字段中取得大二进制位图数据;
2、在system的temp目录创建改位图文件;
3、在对话框中利用StretchBit显示位图;
存储:
1、利用文件选择对话框选择位图文件;
2、显示;
3、点击插入后存储到数据库中

以下是取和存的函数,具体操作大二进制文件的方法,可具体参照一些文档,vckbase有的

//取出位图文件并保存于临时文件
C…
[/Quote]
楼上这位仁兄. 你给这么大一段我也看不明白的..
我上面贴的代码能否帮我看看
mycool2001 2008-09-10
  • 打赏
  • 举报
回复
第2个参数是 一次写入的大小 第3个参数是写入的数量
总大小 = 一次写入的大小 * 写入的数量

没有写入成功,pPic->uImageLen 是有效的数据吗?
VsirSoft 2008-09-10
  • 打赏
  • 举报
回复
读取:   
1、从数据库字段中取得大二进制位图数据;
2、在system的temp目录创建改位图文件;
3、在对话框中利用StretchBit显示位图;
存储:
1、利用文件选择对话框选择位图文件;
2、显示;
3、点击插入后存储到数据库中

以下是取和存的函数,具体操作大二进制文件的方法,可具体参照一些文档,vckbase有的

//取出位图文件并保存于临时文件
CString CStlibPage3::OperateBitmap(CString m_strname)
{
CStandardSet* m_pStandard = new CStandardSet();
m_pStandard->Open();
if (m_pStandard->GetRecordCount()!=0)
m_pStandard->MoveFirst();
int tempnumber = 0;
CByteArray Array1;
while (!m_pStandard->IsEOF())
{
if(m_pStandard->m_StandardName == m_standard_name)
{
Array1.Copy(m_pStandard->m_StabitmapFile);
tempnumber = Array1.GetSize();
break;
}
m_pStandard->MoveNext();
}
m_pStandard->Close();
delete m_pStandard;
DWORD dwWritten;
//**********************************************
char temp_name[_MAX_PATH];
GetTempPath(_MAX_PATH,temp_name);
strcat(temp_name,"bitmap.tmp");
HANDLE fh;
for (int nIndex = 0; nIndex < tempnumber; nIndex++)
{
if (Array1.GetAt(nIndex) == 'B' && Array1.GetAt(nIndex + 1) == 'M'
&& Array1.GetAt(nIndex + 2) != 'P')
{
int HeaderLen = nIndex;// + sizeof(BITMAPFILEHEADER);
Array1.RemoveAt( 0, HeaderLen );
break;
}
}
LPBITMAPINFOHEADER bmiHeader = (LPBITMAPINFOHEADER)Array1.GetData() ;
fh = CreateFile(temp_name,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN,NULL);
WriteFile(fh,(LPBYTE)bmiHeader,(DWORD)tempnumber,&dwWritten,NULL);
Array1.RemoveAll(); //Relese Memory
CloseHandle(fh);
return temp_name;
}

void CStlibPage3::Savebmp_Data()
{
CStandardSet* m_pStandard = new CStandardSet();
m_pStandard->Open();
CString tempid = "StandardName = '" + m_standard_name+"'";
if(m_pStandard->FindLast(tempid))
{
if (strBitmapPath == "")
{
if (!m_pStandard->CanUpdate()) return;
m_pStandard->Edit();
CString strupdate = "NULL";
m_pStandard->SetFieldValue(_T("[StabitmapFile]"),COleVariant(strupdate));
m_pStandard->Update();
goto ip;
}
CFile tempfile;
tempfile.Open(strBitmapPath,CFile::modeRead);
DWORD dwBufSize;
dwBufSize = tempfile.GetLength();
Array.SetSize(dwBufSize);
tempfile.ReadHuge((LPSTR)(Array.GetData()), dwBufSize);
tempfile.Close();
(m_pStandard->m_StabitmapFile).Copy(Array);
if (!m_pStandard->CanUpdate()) return;
m_pStandard->Edit();
m_pStandard->SetFieldValue(_T("[StabitmapFile]"),COleVariant(Array));
m_pStandard->Update();
}
ip:
m_pStandard->Close();
delete m_pStandard;
}

void CStlibPage3::DrawBitmap()
{
UpdateData(TRUE);
//draw bitmap
if (CStlibPage3::hpreview)
DeleteObject(CStlibPage3::hpreview);
CStlibPage3::hpreview = (HBITMAP)LoadImage(AfxGetInstanceHandle(),strBitmapPath,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
if (CStlibPage3::hpreview)
{

GetObject(CStlibPage3::hpreview,sizeof(BITMAP),&bm);

CSize m_sizeSource(bm.bmWidth,bm.bmHeight);
GetDlgItem(IDC_PIC_PREVIEW)->GetClientRect(&m_rectDest);

CClientDC pDC(GetDlgItem(IDC_PIC_PREVIEW));
HDC dcmem = CreateCompatibleDC(pDC);
HBITMAP old = (HBITMAP)SelectObject(dcmem,CStlibPage3::hpreview);

StretchBlt(pDC.m_hDC,m_rectDest.left, m_rectDest.top, m_rectDest.Width(), m_rectDest.Height(),dcmem,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
//GetDlgItem(IDC_PIC_PREVIEW)->GetDC()
SelectObject(dcmem,old);

DeleteDC(dcmem);
}
}

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧