转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> Delphi程序 >> 正文
BCB存取图片等信息!         ★★★★

BCB存取图片等信息!

作者:闵涛 文章来源:闵涛的学习笔记 点击数:1282 更新时间:2009/4/23 18:37:24


如何存储图片信息到数据库中呢!
太多的时候我们要保存图片,电影,MP3,究竟该怎么处理这些信息呢呢!太多的情况下,我们认为应该存储图片保存的路径信息,但是我们考虑数据库要备份的问题的时候,以及数据库要实现转移的时候,可能给我们造成诸多不便!我觉得在某些情况下应该存储图片信息也许是个好主意;就象我们在设计数据库的时候,如果数据量很小的情况下,可以考虑用数据冗余的方法来减少视图的数量;设计数据库是个很灵活的过程,不是说那本书就可以完成任务的,要考虑到程序员和用户的使用方便取一个折中。
经常在CSDN上游逛,经常会遇到太多的相同的问题出现,我觉得应该总结一下,对后来者也有一点点帮助,以谢CSDN前辈们对我的帮助;这里讨论的是如何在BCB中存取图片信息。
第一个是用TADOQuery实现的,就是用SQL语句加上参数实现的。
参考http://expert.csdn.net/Expert/topic/1805/1805073.xml?temp=.556637这个写的,如果你不愿意找的话,原码如下:
 if(OpenPictureDialog1->Execute())
        {
        String strSql = "INSERT INTO table1 (content)";
        strSql = strSql + " VALUES(:picture)";
        try{
            ADOQuery1->Close();
            ADOQuery1->SQL->Clear();
            ADOQuery1->SQL->Add(strSql);
            ADOQuery1->Parameters->ParamByName("picture")->LoadFromFile(OpenPictureDialog1->FileName, ftBlob);
            ADOQuery1->ExecSQL();
        } catch(...) { return;  }
  }
还有一个是用Delphi写的,原码如下(没有调试):
 //(1)如果使用的是TTable,则要将其ReadOnly属性先置为false,然后调用Edit函数;
 //(2)如果使用的是TQuery,则要将其RequestLive属性先置为true,然后调用Edit函数;
 var
        ms : TADOBlobStream;
 begin
       query1.Edit;//只能是Edit;不能是Append 和 Insert;
       ms := TADOBlobStream.Create(TBlobField(query1.FieldByName(''''BMP'''')), bmRead);
       ms.Seek(0, soFromBeginning);
       ms.SaveToFile(''''d:\l.bmp'''');
       query1.Post;
       ms.Free;
 end;
同样那位大哥的BCB代码如下:
 //(1)如果使用的是TTable,则要将其ReadOnly属性先置为false,然后调用Edit函数;
 //(2)如果使用的是TQuery,则要将其RequestLive属性先置为true,然后调用Edit函数;
 void __fastcall TForm1::BitBtn1Click(TObject *Sender)
 {
       Table1->Edit();;//只能是Edit();不能是Append() 和 Insert();
       TBlobField * pField=(TBlobField *)Table1->FieldByName("图字段名");
       TBlobStream * pmem=new TBlobStream(pField,bmWrite);
       pmem->Seek(0,soFromBeginning);
       Graphics::TBitmap * pBitmap=new Graphics::TBitmap();
       pBitmap->LoadFromFile("d:\\image\\a.bmp");
       pBitmap->SaveToStream(pmem);
       Table1->Post();
       delete pBitmap;
       delete pmem;
 }
同样类似的BCB代码如下(上边的虽然没有调试,但和我写的道理还是一样的,就是用数据库中的一个字段和一个流对象,然后对流进行操作而已):
  TMemoryStream *stream = new TMemoryStream();
        Image1->Picture->Bitmap->SaveToStream(stream);
        ADOTable1->Insert();
        ADOTable1->FieldByName("title")->AsString=Edit1->Text;
        ((TGraphicField *)(ADOTable1->FieldByName("content")))->LoadFromStream(stream);
        ADOTable1->Post();
        delete stream;
读取的方法类似,当为了方便大家,还是写出来,如下:
 include <clipbrd.hpp>
 TStream *Stream1;
   TJPEGImage   *Pjp;
   Pjp=new TJPEGImage();
 ADOQuery1->Open();
   try
   {
     Stream1=ADOQuery1->CreateBlobStream(ADOQuery1->FieldByName("treenodes"), bmRead);//treenodes是存放jpeg内容的字段,它的类型一定要用image
     Pjp->LoadFromStream(Stream1);//Image2是TDBImage组件,它的DateSource,和FieldName属性要空着
     Image2->Picture->Bitmap->Assign(Pjp);
     delete Stream1;
   }
   __finally
   {
    ADOQuery1->Close();
    delete Pjp;
   }
还有更绝的,用个宏,如下:
 以下是讀出各種類型的圖片的程序,支持ADO,BDE或TClientDataSet
 #define PICTURE_MAP__(TBit) {TBit *PG = new TBit(); \
                             try {PG->LoadFromStream(TmpStream);\
                                  Pic->Assign(PG); \
                                 }\
                             catch(...)\
                               {delete PG ;\
                                return false;\
                               }\
                             delete PG;\
                             }
 //----------------------------------------------------------------
 //該模板將二進制字段中的圖像(GIF或JPG等等)使用Assign方法轉為TPicture,TBitmap等等。 
 template <class T >
 ool LoadPhotoFromField(TField *F_Photo,const  AnsiString Format,T *Pic)
 if(!F_Photo->DataSet->Active) return false ;
 if(F_Photo->IsNull) return false ;
 else
  {TStream *TmpStream = F_Photo->DataSet->CreateBlobStream(F_Photo,bmRead);
    if(Format == ".JPG" || Format == ".JPEG")PICTURE_MAP__(TJPEGImage )
    else if(Format == ".BMP")                           PICTURE_MAP__(Graphics::TBitmap)
 //   else if(Format == ".GIF")                      PICTURE_MAP__(TGIFImage )
    else if(Format == ".ICO")                      PICTURE_MAP__(TIcon)
    else if(Format == ".WMF" || Format ==".EMF")  PICTURE_MAP__(TMetafile)
   else   return false ;
   
 return true;
 
 undef PICTURE_MAP__(TBit)
 /如果要支持GIF,那你要安裝支持GIF的VCL類。
 持多種格式
 入:
 f(OpenPictureDialog1->Execute())
  {DataSet->Edit();
   TBlobField *Field = (TBlobField*)DataSet->FieldByName("photo");
   Field->LoadFromFile(OpenPictureDialog1->FileName);
   DataSet->FieldByName("photoFormat")->AsString =
        ExtractFileExt(OpenPictureDialog1->FileName).UpperCase();
    ataSet->Post();
在http://expert.csdn.net/Expert/topic/1348/1348495.xml?temp=.5143854中,JSP老大的方法,其实也是一样的!:
 if(!OpenPictureDialog1->Execute())
     return;
 ADOTable1->Insert();
 ADOTable1->FieldByName("title")->AsString=Edit1->Text;
 TADOBlobStream* Stream = (TADOBlobStream*)ADOTable1->CreateBlobStream(ADOTable1->FieldByName("content"),bmWrite);
 Stream->LoadFromFile(OpenPictureDialog1->FileName);
 delete Stream;
 ADOTable1->Post();
在http://expert.csdn.net/Expert/topic/1326/1326759.xml?temp=.3533899中,打工仔大哥的方法:
 读
 TBlobField * pField=(TBlobField *)dm_police->y_find->FieldByName("image_photo");
        TClientBlobStream * pmem=new TClientBlobStream(pField,bmRead);
        pmem->Seek(0,soFromBeginning);
 //Graphics::TBitmap * pBitmap=new Graphics::TBitmap();
        TJPEGImage *pBitmap = new TJPEGImage();
        pBitmap->LoadFromStream(pmem);
        Image2->Picture->Assign(pBitmap);
        delete pmem;
        delete pBitmap;
 写
 dm_police->y_stress_man_photo->Open();
             &

[1] [2]  下一页


没有相关教程
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台