将图片保存到数据库?

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");
...全文
200 9 打赏 收藏 转发到动态 举报
写回复
用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);
}
}
MySQL 教程MySQL 是流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。在本教程中,会让大家快速掌握 MySQL 的基本知识,并轻松使用 MySQL 数据库。什么是数据库数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。每个数据库都有一个或多个不同的 API 用于创建,访问,管理,搜索和复制所保存的数据。我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢。所以,现在我们使用关系型数据库管理系统(RDBMS)来存储和管理大数据量。所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。RDBMS 即关系数据库管理系统(Relational Database Management System)的特点:1.数据以表格的形式出现2.每行为各种记录名称3.每列为记录名称所对应的数据域4.许多的行和列组成一张表单5.若干的表单组成databaseRDBMS 术语 在我们开始学习MySQL 数据库前,让我们先了解下RDBMS的一些术语:数据库数据库是一些关联表的集合。数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。列: 一列(数据元素) 包含了相同类型的数据, 例如邮政编码的数据。行:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。冗余:存储两倍数据,冗余降低了性能,但提高了数据的安全性。主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。外键:外键用于关联两个表。复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。MySQL 为关系型数据库(Relational Database Management System), 这种所谓的关系型可以理解为表格的概念, 一个关系型数据库由一个或数个表格组成, 如图所示的一个表格: 表头(header): 每一列的名称;列(col): 具有相同数据类型的数据的集合;行(row): 每一行用来描述某条记录的具体信息;值(value): 行的具体信息, 每个值必须与该列的数据类型相同;键(key): 键的值在当前列中具有唯一性。MySQL数据库MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。MySQL 是开源的,目前隶属于 Oracle 旗下产品。MySQL 支持大型的数据库。可以处理拥有上千万条记录的大型数据库。MySQL 使用标准的 SQL 数据语言形式。MySQL 可以运行于多个系统上,并且支持多种语言。这些编程语言包括 C、C++、Python、Java、Perl、PHP、Eiffel、Ruby 和 Tcl 等。MySQL 对PHP有很好的支持,PHP 是目前流行的 Web 开发语言。MySQL 支持大型数据库,支持 5000 万条记录的数据仓库,32 位系统表文件最大可支持 4GB,64 位系统支持最大的表文件为8TB。MySQL 是可以定制的,采用了 GPL 协议,你可以修改源码来开发自己的 MySQL 系统。Redis 教程REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统,是跨平台的非关系型数据库。Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。Redis 通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等类型。

16,472

社区成员

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

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

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