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

把图片存/取至数据库相关推荐

  1. 如何将图片存进SQL数据库中以及从数据库读取照片(解决办法)

    目录 1.选择本地图片并存进数据库 2.Save()方法 3.从数据库读取照片 最近项目要需要上传与下载图片,想了想如何存储图片,可以用本地路径与用二进制数据存储到数据库.最后权衡利弊决定将图片存进数 ...

  2. SpiderMan:异步加载,图片爬取,数据库存储,多进程爬虫,IP代理

    1,使用API 1.1,API使用方法 API是通过Requests请求和服务端的Response回应来完成API的一次调用,所以用Python语言进行API的调用时,便可以使用Requests库来进 ...

  3. 怎样把图片存上mysql数据库表中_怎样把图片存入SQL数据库表中?

    展开全部 一.先来熟悉一下将要使用的对象方法: 用来获取上一个页面传 递过来的数据一62616964757a686964616fe58685e5aeb931333431363030般是使用Reques ...

  4. 将image存入mysql数据库_有谁知道如何把一图片存放到mysql数据库中

    root@ytt:/var/lib/mysql-files# for i in `seq 1 100`; do cp 微信图片_20190711095019.jpg "$i".jp ...

  5. scrapy爬虫储存到mysql_详解Python之Scrapy爬虫教程NBA球员数据存放到Mysql数据库

    获取要爬取的URL 爬虫前期工作 用Pycharm打开项目开始写爬虫文件 字段文件items # Define here the models for your scraped items # # S ...

  6. python批量读取图片并批量保存_Python实现批量读取图片并存入mongodb数据库的方法示例...

    本文实例讲述了Python实现批量读取图片并存入mongodb数据库的方法.分享给大家供大家参考,具体如下: 我的图片放在E:\image\中,然后使用python将图片读取然后,显示一张,存入取一张 ...

  7. 图片存base64后展示问题

    如图片存成clob  blob  text等格式,为base64格式时,最好存之前拼接前缀 data:image/png;base64, 直接取值在image即可展示 <image src=&q ...

  8. java spring+mybatis整合实现爬虫之《今日头条》搞笑动态图片爬取

    java spring+mybatis整合实现爬虫之<今日头条>搞笑动态图片爬取(详细) 原文地址原博客地址 先上效果图 抓取的动态图: 数据库: 一.此爬虫介绍 今日头条本身就是做爬虫的 ...

  9. php向数据库中插入图片,php如何向数据库添加图片

    百度开发者的云代码空间为了保证高可用,不允许用户将图片保存到代码空间中,使用CDN或者对象存储不仅收费而且使用比较复杂,于是考 虑能否将img存储在数据库中,虽然很多人说会造成性能问题,权当一试. 1 ...

最新文章

  1. 青源 Forum | 人工智能的数理基础前沿系列报告 · 第 4 期
  2. 互联网1分钟 |1116
  3. linux xargs命令,xargs 命令教程
  4. 天气预报的Ajax效果
  5. 不需要安装max或者xcode的object C开发环境
  6. 170819-关于JSTL的知识点
  7. dell 服务器ghost系统,Dell 5000笔记本装win7 64位Ghost系统真正成功教程
  8. 新版Excel和Word全屏打印预览的设定方法
  9. 安卓 手机硬改 工具下载 一键新机 改串 抹机 root隐藏 改串号MEID imei SN信息 工具教程分享
  10. 电子书阅读器背景颜色修改方法
  11. 米的换算单位和公式_米的换算单位
  12. 苹果ios8_手机资讯:你必须要知道的iOS8实用小技巧汇总
  13. 联合阿里在职测开工程师耗时一个星期写的 【接口测试+自动化接口接口测试详解]
  14. 测试测量 | 【四】如何实现生产过程中的自动化测试?——保证高频信号的准确传输
  15. 失望时想起了你是什么歌_你是空你是空色即是空的空空什么歌 《想起了你》哪里听...
  16. Oracle的LAST_DAY函数
  17. xsmax进入dfu模式_iPhoneXSMax怎么强制重启-如何进入DFU模式
  18. 杭电数字电路课程设计-实验十-JK触发器设计实验
  19. 什么是“富人思维”?
  20. 计算机毕业设计(75)php小程序毕设作品之网上销售小程序商城系统

热门文章

  1. 转『天涯杂谈』那些让人惊艳的歌词(整理版),很经典,与大家分享。
  2. LinkedList面试要点总结
  3. 千与千寻主题曲beep函数版
  4. ChatGPT爆火背后的真相:学编程已经成为必选项
  5. python入门书籍推荐,看这篇文章就够,请!
  6. 为了推动仓库无纸化操作我们做了什么?
  7. ERROR: Rosdep experienced an error: Unable to handle package.xml format version ‘3‘
  8. 我的MACBOOK安装的软件
  9. ipad iphone开发_如何在iPhone或iPad上更改DNS服务器
  10. ios手机 按钮点击事件没反应(按钮是js生成的)