用dbimage或image如何显示jpg格式的图片。我用的是sqlserver 2000,用dbimage或image显示表里的image字段。
     望大侠多多指教。。

解决方案 »

  1.   

    Delphi提供了数据访问(DataAccess)和数据控制(DataControls)的可视化控件,能够方便快捷地产生具有良好界面且功能强大的数据库应用程序。对于涉及图像数据(含Graphic字段)的数据库应用程序,如人事管理信息系统等,图像数据的存取技术是一个关键。然而,有关Delphi下图象的存取,特别是图像的保存方面的技术各种资料上很少提及。下面,笔者结合一个简单的例子来说明。一、图像数据的保存
      1.创建一个含有Graphic字段的数据库列表。
      在WindowsISQ(或Databasedesktop)下create database mydb.gdb
      create table myfrieds
      (name varchar(15) notnull,
              telephone varchar(12),
              address varchar(30),
              zipvarchar(8),
             picture varchar(15),
             image blob);  其中,picture字段用于保存图像的名称(包括路径),image(Graphic字符)则用于存储图像,其数据类型
    为“blob”。  2.建立窗体(如图1所示),设置窗体中各控件的属性。  该窗体的主要功能是将某人信息进行编辑和保存。需要注意的图像保存所用的图像框必须用TImage而不能用TDBImage,编辑框宜用Tedit而不宜用TDBEdit,这一点与图像的读取恰好相反。  其中,各主要控件的属性设置如下:
      Datasource1.Dataset:=table1;
      Table1.Databasename:=mydb.gdb;
      Table1.Tablename:=myfriends;
      Table1.active:=true;
      其他诸如Caption之类的属性设置不再叙述。  3.数据处理程序的建立。
      (1)图像( .bmp文件)打开的处理。
      procedureTForm1.pictopenbtnClick(Sender:TObject);
      begin
                opendialog1.execute;
         image1.picture.loadfromfile(opendialog1.filename);
      end;  (2)图像保存的处理。
      图像保存的处理程序完成把在窗体1所编辑的信息包括图像保存到相应的数据库中,其关键是要定义一个Graphic类型的变量且该变量要用Assign()函数传递到相应数据库中保存。具体程序如下:
      procedureTform1.Savebtnclick(sender:TObject);
      var
                graphic1:TGraphic;
      begin
               graphic1:=TGraphic.Create;
         graphic1.loadfromfile(opendialog1.filename);
        table1.insert;
        table1.fieldbyname('name').asstring:=edit1.text;
        table1.fieldbyname('telephon').asstring:=edit2.text;
        table1.fieldbyname('address').asfloat:=edit3.text;
        table1.fieldbyname('zip').asfloat:=edit4.text;
        table1.fields[4].assign(graphic1);
        table1.post;
        graphic1.free;
      end;二、图像数据的读取
      在数据库数据(包括Graphic字段的数据)的读取和浏览方面,Delphi这一具有强大代码自动生成功能的面向对象的开发工具的优越性得到淋漓尽致的体现。毫不夸张地说,不需要一条语句即可完成这一功能!  建立窗体(如下图所示),设置各控件的属性。  图中Table1和Datasource1的属性的设置与数据的保存部分(图1)相同,所不同的是数据库数据的读取时用TDBEdit和TDBImage控件而不用TEdit和TImage。控件TDBEdit和TDBImage只要将datafield属性设置为其相对应的域;TDBNavigator的datasouce属性设置为datasource1即可。 
      

  2.   

    bmp好处理,关键是jpg格式。目前情况是:图片(包括bmp,jpg格式)我已经存到数据库里了,不知如何用Timage或Tdbimage来显示它。(数据库字段的定义:CMTB image default NULL;)
      

  3.   

    在数据库中添加一个字段,用以区分bmp,jpg格式的标志。声明一个TBlobStream对象先,将数据库中的图像字段读到该类型的变量strm中,用TBlobStream对象的Create方法,然后根据bmp,jpg标志分别创建TJpegImange对象或TBitmap对象的变量,这两个对象都有loadfromstream方法,用该方法将strm流对象的内容读入TJpegImage或Tbitmap对象类型的变量中,最后把创建的两个Tjpegimage和TBitmap类型的变量赋给要显示图像的图像控件的Picture属性。读取结束后释放所用资源!
      

  4.   

    提示:将图片bmp转换为二进制再转换成jpg显示
      

  5.   

    bmp好处理,关键是jpg格式。目前情况是:图片(包括bmp,jpg格式)我已经存到数据库里了,不知如何用Timage来显示它。(msqlserver2000数据库字段的定义:CMTB image default NULL;).
      

  6.   

    在数据库添加这样一个字段isbmp,用以区分jpg格式和bmp格式,记得在接口单元里引用JPEG单元。
    以下是我写的代码:
    var
      strm:tblobstream;
      jpegimage:TJpegimage;
      bitmap:tbitmap;
    begin
      strm := tblobstream.Create(tblobfield(table1.fieldbyname('CMTB')),bmread);
      try //try1
        strm.position :=0;
        image1.Picture.Graphic := nil; 
        if table1.fieldbyname('isbmp').asstring ='1' then 
        begin //begin11
          bitmap := tbitmap.Create ;
          try //try11
            bitmap.LoadFromStream(strm);
            image1.Picture.Graphic := bitmap;
          finally
            bitmap.Free;
          end; //end try11end //
        end
        else
        if table1.fieldbyname('isbmp').asstring ='0' then 
        begin
          //begin12
          jpegimage := tjpegimage.Create ;
          try //try12
            jpegimage.LoadFromStream(strm);
            image1.Picture.Graphic := jpegimage;
          finally
            jpegimage.Free ;
          end; //end try12end; //
        end ;
      finally
        strm.Free ;
      end;  //try1end; Table1就是连接数据库中存放图像字段的表的数据集,image1就是要在其中显示图像的控件,将改段代码添加在Table1的AfterScroll事件中!
    这段代码我已经用过,没有问题的,希望对你有所帮助!
      

  7.   

    我觉得如果你愿意的话,也可以在程序里面写个代码,自动把BMP图片转存为JPG文件,这样方便
      

  8.   

    请问楼上,如何将jpg转为bmp呢,
    我这样定义
    var
      strm:tblobstream;
      jpgimage:TJpgimage;
    报错,定义非法。为啥呢,
      

  9.   

    呵呵,楼上说了一大堆,没说道点子上,人家说只是显示,你们转换过来转换过去,做什么啊
    uses
      jepg;  -->加上就可以啦
      

  10.   

    楼上,不行啊,加上 jepg??
      

  11.   

    我来解答楼主:打开一个jpg或者jpeg的图片,放在dbimage中显示,然后在存入sql server数据库:
    用一个openpicturedialog对话框控件,一个dbimage,将dbimage与数据库中对应的域连好,数据库中
    对应类型为:image。
    openpicturedialog的属性框中要设置一下,过滤,filter。点击……,出现一个过滤编辑对话框,
    左侧名称为:所有jpg(自己起一个名字),右边*.jpg ;下一行一样
                所有jpeg                 ,右边*.jpeg;
    然后在option属性中的ofallowmultiselect 选择为true。  ok,下面编程:procedure TForm1.BitBtnChoseImageClick(Sender: TObject);
    var
       jpgimage,resizejpg: TJpegImage;
       resizedbitmap : tbitmap;
       newheight, newwidth : integer;
       stretchrect : trect;
    begin  jpgimage :=tjpegimage.Create;
      resizejpg:=tjpegimage.create;
      resizedbitmap := tbitmap.create;  if OPENpicturedialog1.Execute then
        jpgimage.LoadFromFile(openpicturedialog1.FileName);
       newheight := 217;   //调整大小,你可以自己设置啦。
       newwidth :=393;
       stretchrect.left := 0;
       stretchrect.Top := 0;
       stretchrect.right := newwidth;
       stretchrect.bottom := newheight;
       resizedbitmap.Width := newwidth;
       resizedbitmap.height := newheight;    resizedbitmap.Canvas.StretchDraw(stretchrect, jpgimage);
        dbimage1.Picture.Assign(resizedbitmap);
        jpgimage.Free;
        resizejpg.Free;
        resizedbitmap.Free;
    end;
    向数据库中添加一步,就非常简单了,因为你的对应的域已经连好了,所以
    你就直接向数据库添加就ok了。
    希望能帮助你。祝你好运!
      

  12.   

    先 uses jpeg
    var
      ImageBMP:Tbitmap;
      ImageJPEG:Tjpegimage;
    begin
    try
      if bsSkinOpenPictureDialog1.Execute then
      begin
        Data.dsProbation.DataSet.Edit;
        if uppercase(ExtractFileExt(bsSkinOpenPictureDialog1.FileName))='.JPG' then
        begin
          ImageBMP:=Tbitmap.Create;
          ImageJPEG:=TjpegImage.Create;
          ImageJPEG.LoadFromFile(bsSkinOpenPictureDialog1.FileName);
          ImageBMP.Assign(ImageJPEG);
          ImageBMP.SaveToFile(ExtractFilePath(application.ExeName)+'TempBMP.BMP');
           //bsSkinDBImage1.Picture.LoadFromFile(bsSkinOpenPictureDialog1.FileName);//
          bsSkinDBImage1.Picture.LoadFromFile(ExtractFilePath(application.ExeName)+'TempBMP.BMP');
        end
        else
          bsSkinDBImage1.Picture.LoadFromFile(bsSkinOpenPictureDialog1.FileName);
      end;
      except
       unit1.frm_mian.bsSkinMessage1.MessageDlg('您选择的图片格式有误,请从新选择!', mtInformation, [mbOK], 0);
      exit;
      end;
    end;
    不知道是我用的控件问题还是DELPHI的BUG ,DBImage1不能正常显示JPG的图片,所以要把JPG的转成BMP的,如果在放入数据库,这样唯一不好的就是BMP的图太大了,影响数据库的质量!
      

  13.   

    告诉你个很简单的方法:下载图片到本地,然后把文件名返回给image;
    下载代码:tblobfield(DBModule.QTmp.FieldByName('jpg')).SaveToFile(temp.jpg));
    上传代码:tblobfield(DBModule.QTmp.FieldByName('jpg')).LoadFromFile(temp.jpg);
    temp.jpg是图片名称,可以自己定义,也可以取数据库中表示文件名称的字段