把图片存/取至数据库
http://blog.chinaunix.net/uid-607545-id-2088102.html
http://blog.csdn.net/eryadabendan/article/details/6749939
关于图片的存储和显示
第一步:首先是要打开一个位图文件,这里使用的控件用Picture控件,就是控件图标右边最上面那个,改ID号为IDC_PICTURE,然后定义两个成员变量
char *m_char;//图片文件指针 DWORD m_nFileLen;//图片长度 然后在函数中写入: CFileDialog dlg(TRUE,NULL,NULL,0,"photo Files (*.jpg;*.bmp)|*.jpg;*.bmp|",this);if(IDOK==dlg.DoModal()) {m_path=dlg.GetPathName();m_bool=true; }CWnd *pWnd = GetDlgItem(IDC_PICTURE); CRect rect; pWnd->GetClientRect(&rect); CDC *pDC = pWnd->GetDC(); CFileStatus fstatus; CFile file; LONG cb; BOOL m_tm=false;IPicture *pPic; CString m_sPath; if (file.Open(m_path,CFile::modeRead)&& file.GetStatus(m_path,fstatus)&&((cb = fstatus.m_size) != -1)) {if(cb>1048576) //可在此设置图片大小 {m_tm=false;MessageBox("图片不能大于1M","提示!");}else{m_nFileLen=(UINT)cb; HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb); LPVOID pvData = NULL; if (hGlobal != NULL) { if ((pvData = GlobalLock(hGlobal)) != NULL) { file.ReadHuge(pvData, cb); m_char=(char*)pvData;GlobalUnlock(hGlobal); CreateStreamOnHGlobal(hGlobal, TRUE, &pStm); m_tm=true;// m_bool=true; } elseAfxMessageBox("不是图片文件!");} elseAfxMessageBox("申请内存失败!");}} elseAfxMessageBox("不是图片文件!");if(m_tm) { SUCCEEDED(OleLoadPicture(pStm,fstatus.m_size,TRUE,IID_IPicture,(LPVOID*)&pPic));OLE_XSIZE_HIMETRIC hmWidth; OLE_YSIZE_HIMETRIC hmHeight; pPic->get_Width(&hmWidth); pPic->get_Height(&hmHeight); if(FAILED(pPic->Render(*pDC,0,0,rect.Width(),rect.Height(),0,hmHeight,hmWidth,-hmHeight,NULL))) AfxMessageBox("渲染图像失败!"); pPic->Release(); } 这里还有个小小的问题,就是当窗口出现重画的时候图片就会消失,可以把上面的代码加入到OnPaint函数中去; 接来就是保存文件(怎么访问数据库的可以去看下我空间里的"用ADO访问数据库"): 在Access数据库中把要放相片字段的类型改为OLE 类型(在SQL数据库改成相片类型). m_RecordSet->AddNew(); char *pBuf = m_char;//把图片的指针传给pBuf VARIANT varBLOB;SAFEARRAY *psa;SAFEARRAYBOUND rgsabound[1];if(pBuf){ rgsabound[0].lLbound = 0;rgsabound[0].cElements = m_nFileLen;psa = SafeArrayCreate(VT_UI1, 1, rgsabound);for (long i = 0; i < (long)m_nFileLen; i++)SafeArrayPutElement (psa, &i, pBuf++);varBLOB.vt = VT_ARRAY | VT_UI1;varBLOB.parray = psa;m_pRecordset->GetFields()->GetItem("读者相片")->AppendChunk(varBLOB); }m_pRecordset->Update();
接下来就是把图片从数据库中取出来,在放图相的对话框中加入Picture控件,改ID为IDC_PICTURE,然后 在函数中写入:
IStream *pStm; long lDataSize = m_pRecordset->GetFields()->GetItem("读者相片")->ActualSize;if(lDataSize > 0){ _variant_t varBLOB; varBLOB = theApp.m_data.m_pRecordset->GetFields()->GetItem("读者相片")->GetChunk(lDataSize); if(varBLOB.vt == (VT_ARRAY | VT_UI1)){char *pBuf = NULL;SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, lDataSize); LPVOID pvData = NULL; if (hGlobal != NULL) { if ((pvData = GlobalLock(hGlobal)) != NULL) { memcpy(pvData,pBuf,lDataSize);SafeArrayUnaccessData (varBLOB.parray);GlobalUnlock(hGlobal); CreateStreamOnHGlobal(hGlobal, TRUE, &pStm); } elseAfxMessageBox("加载图片失败!");} elseAfxMessageBox("申请内存失败!");}CWnd *pWnd = GetDlgItem(IDC_PICTURE); CRect rect; pWnd->GetClientRect(&rect); CDC *pDC = pWnd->GetDC(); IPicture *pPic; if(SUCCEEDED(OleLoadPicture(pStm,lDataSize,TRUE,IID_IPicture,(LPVOID*)&pPic))) { OLE_XSIZE_HIMETRIC hmWidth; OLE_YSIZE_HIMETRIC hmHeight; pPic->get_Width(&hmWidth); pPic->get_Height(&hmHeight); if(FAILED(pPic->Render(*pDC,0,0,rect.Width(),rect.Height(),0,hmHeight,hmWidth,-hmHeight,NULL))) AfxMessageBox("渲染图像失败!"); pPic->Release(); }}
这样写也会出现当窗口重绘窗口图片就会消失的问题,可以把上面的函数写在OnPaint()中.整个显示,存取和访问图片的程序就已经完成了.
CoInitialize(NULL);_ConnectionPtr m_pConnect;try{// 创建Connection对象m_pConnect.CreateInstance("ADODB.Connection");// 设置连接字符串,必须是BSTR型或者_bstr_t类型_bstr_t strConnect = "Provider=SQLOLEDB.1;Password=111111;Persist Security Info=True;User ID=sa;Initial Catalog=Picture;Data Source=SHOWFLY\\SQL2005";m_pConnect->Open(strConnect,"","",adModeUnknown);}// 捕捉异常catch(_com_error e){// 显示错误信息AfxMessageBox(e.Description());}CFile fileAdd;if(fileAdd.Open("F:/20087610203.JPG",CFile::modeRead)==0) //打开文件return;_variant_t varChunk;long m_nFileLen = fileAdd.GetLength();BYTE* m_pBMPBuffer;m_pBMPBuffer = new BYTE[m_nFileLen];if(m_pBMPBuffer==NULL)return;fileAdd.Read(m_pBMPBuffer,m_nFileLen); //向数据库添加图片_RecordsetPtr m_pRecordset;m_pRecordset.CreateInstance(__uuidof(Recordset));try{m_pRecordset->Open(_variant_t("dbo.userphoto"),_variant_t((IDispatch*)m_pConnect,true),adOpenKeyset,adLockOptimistic,adCmdTable);}catch(_com_error &e){::MessageBox(NULL,"无法打开userphoto表!","提示",MB_OK|MB_ICONWARNING);}char *pBuf = (char*)m_pBMPBuffer;VARIANT varBLOB;SAFEARRAY *psa;SAFEARRAYBOUND rgsabound[1];m_pRecordset->AddNew(); ///添加新记录m_pRecordset->PutCollect("username",_variant_t("小李")); ///为新记录填充username字段m_pRecordset->PutCollect("old",_variant_t((long)28)); ///填充old字段if(pBuf){rgsabound[0].lLbound = 0;rgsabound[0].cElements = m_nFileLen;psa = SafeArrayCreate(VT_UI1, 1, rgsabound); ///创建SAFEARRAY对象for (long i = 0; i < (long)m_nFileLen; i++)SafeArrayPutElement (psa, &i, pBuf++); ///将pBuf指向的二进制数据保存到SAFEARRAY对象psa中varBLOB.vt = VT_ARRAY | VT_UI1; ///将varBLOB的类型设置为BYTE类型的数组varBLOB.parray = psa; ///为varBLOB变量赋值m_pRecordset->GetFields()->GetItem("photo")->AppendChunk(varBLOB);///加入BLOB类型的数据}m_pRecordset->Update(); ///保存我们的数据到库中
//从数据库读出图片long lDataLength = m_pRecordset->GetFields()->GetItem(_variant_t("photo"))->ActualSize;if (lDataLength>0){_variant_t varBLOB;varBLOB=m_pRecordset->GetFields()->GetItem(_variant_t("photo"))->GetChunk(lDataLength);if(varBLOB.vt== (VT_ARRAY|VT_UI1) && varBLOB.vt!=VT_EMPTY && varBLOB.vt!=VT_NULL ){BYTE *pBuf = NULL;pBuf = (BYTE*)GlobalAlloc(GMEM_FIXED,lDataLength);SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);CFile outFile("D:/20087610203.bmp",CFile::modeCreate|CFile::modeWrite); //构造新文件,如果文件存在,则长度变为0outFile.Write(pBuf,lDataLength);outFile.Close();SafeArrayUnaccessData (varBLOB.parray);}}m_pRecordset->Close();m_pConnect->Close();::CoUninitialize();
http://www.cnblogs.com/-clq/archive/2011/08/27/2155342.html
转载于:https://www.cnblogs.com/wxl845235800/p/7430008.html
把图片存/取至数据库相关推荐
- 如何将图片存进SQL数据库中以及从数据库读取照片(解决办法)
目录 1.选择本地图片并存进数据库 2.Save()方法 3.从数据库读取照片 最近项目要需要上传与下载图片,想了想如何存储图片,可以用本地路径与用二进制数据存储到数据库.最后权衡利弊决定将图片存进数 ...
- SpiderMan:异步加载,图片爬取,数据库存储,多进程爬虫,IP代理
1,使用API 1.1,API使用方法 API是通过Requests请求和服务端的Response回应来完成API的一次调用,所以用Python语言进行API的调用时,便可以使用Requests库来进 ...
- 怎样把图片存上mysql数据库表中_怎样把图片存入SQL数据库表中?
展开全部 一.先来熟悉一下将要使用的对象方法: 用来获取上一个页面传 递过来的数据一62616964757a686964616fe58685e5aeb931333431363030般是使用Reques ...
- 将image存入mysql数据库_有谁知道如何把一图片存放到mysql数据库中
root@ytt:/var/lib/mysql-files# for i in `seq 1 100`; do cp 微信图片_20190711095019.jpg "$i".jp ...
- scrapy爬虫储存到mysql_详解Python之Scrapy爬虫教程NBA球员数据存放到Mysql数据库
获取要爬取的URL 爬虫前期工作 用Pycharm打开项目开始写爬虫文件 字段文件items # Define here the models for your scraped items # # S ...
- python批量读取图片并批量保存_Python实现批量读取图片并存入mongodb数据库的方法示例...
本文实例讲述了Python实现批量读取图片并存入mongodb数据库的方法.分享给大家供大家参考,具体如下: 我的图片放在E:\image\中,然后使用python将图片读取然后,显示一张,存入取一张 ...
- 图片存base64后展示问题
如图片存成clob blob text等格式,为base64格式时,最好存之前拼接前缀 data:image/png;base64, 直接取值在image即可展示 <image src=&q ...
- java spring+mybatis整合实现爬虫之《今日头条》搞笑动态图片爬取
java spring+mybatis整合实现爬虫之<今日头条>搞笑动态图片爬取(详细) 原文地址原博客地址 先上效果图 抓取的动态图: 数据库: 一.此爬虫介绍 今日头条本身就是做爬虫的 ...
- php向数据库中插入图片,php如何向数据库添加图片
百度开发者的云代码空间为了保证高可用,不允许用户将图片保存到代码空间中,使用CDN或者对象存储不仅收费而且使用比较复杂,于是考 虑能否将img存储在数据库中,虽然很多人说会造成性能问题,权当一试. 1 ...
最新文章
- 青源 Forum | 人工智能的数理基础前沿系列报告 · 第 4 期
- 互联网1分钟 |1116
- linux xargs命令,xargs 命令教程
- 天气预报的Ajax效果
- 不需要安装max或者xcode的object C开发环境
- 170819-关于JSTL的知识点
- dell 服务器ghost系统,Dell 5000笔记本装win7 64位Ghost系统真正成功教程
- 新版Excel和Word全屏打印预览的设定方法
- 安卓 手机硬改 工具下载 一键新机 改串 抹机 root隐藏 改串号MEID imei SN信息 工具教程分享
- 电子书阅读器背景颜色修改方法
- 米的换算单位和公式_米的换算单位
- 苹果ios8_手机资讯:你必须要知道的iOS8实用小技巧汇总
- 联合阿里在职测开工程师耗时一个星期写的 【接口测试+自动化接口接口测试详解]
- 测试测量 | 【四】如何实现生产过程中的自动化测试?——保证高频信号的准确传输
- 失望时想起了你是什么歌_你是空你是空色即是空的空空什么歌 《想起了你》哪里听...
- Oracle的LAST_DAY函数
- xsmax进入dfu模式_iPhoneXSMax怎么强制重启-如何进入DFU模式
- 杭电数字电路课程设计-实验十-JK触发器设计实验
- 什么是“富人思维”?
- 计算机毕业设计(75)php小程序毕设作品之网上销售小程序商城系统
热门文章
- 转『天涯杂谈』那些让人惊艳的歌词(整理版),很经典,与大家分享。
- LinkedList面试要点总结
- 千与千寻主题曲beep函数版
- ChatGPT爆火背后的真相:学编程已经成为必选项
- python入门书籍推荐,看这篇文章就够,请!
- 为了推动仓库无纸化操作我们做了什么?
- ERROR: Rosdep experienced an error: Unable to handle package.xml format version ‘3‘
- 我的MACBOOK安装的软件
- ipad iphone开发_如何在iPhone或iPad上更改DNS服务器
- ios手机 按钮点击事件没反应(按钮是js生成的)