参考过取它的贴子,如
var 
  MyJPEG : TJPEGImage;
  MS: TMemoryStream;
begin
  openpicturedialog1.Execute;
    if openpicturedialog1.FileName<>'' then
  begin
    image.Picture.LoadFromFile(openpicturedialog1.FileName);
    openpicturedialog1.FileName:='';
    MyJPEG := TJPEGImage.Create;
    try
      with MyJPEG do
      begin
        Assign(Image.Picture.Graphic);
        MS:=TMemoryStream.create;
        SaveToStream(MS);
        MS.Position:=0;
        adotable1.Append;
        TBlobField(adotable1.FieldbyName('photo')).LoadFromStream(MS);
        adotable1.Post;
        messagebox(getactivewindow(),'图像保存完毕!','保存',mb_ok);
        image.Picture.CleanupInstance;
      end;
    finally
      MyJPEG.Free;
    end;
  end;
运行没问题,保存图时,就会出现这样错误,bitmap image is not a voild

解决方案 »

  1.   

    var 
      MyJPEG : TJPEGImage;
      MS: TMemoryStream;
    begin
      openpicturedialog1.Execute;
      if openpicturedialog1.FileName<>'' then
      begin
        image.Picture.LoadFromFile(openpicturedialog1.FileName);
        openpicturedialog1.FileName:='';
        MyJPEG := TJPEGImage.Create;
        try
          with MyJPEG do
          begin
            Assign(Image.Picture.Graphic);
            MS:=TMemoryStream.create;
            SaveToStream(MS);
            MS.Position:=0;
            adotable1.Append;
            TBlobField(adotable1.FieldbyName('photo')).LoadFromStream(MS);
            adotable1.Post;
            messagebox(getactivewindow(),'图像保存完毕!','保存',mb_ok);
            image.Picture.CleanupInstance;
          end;
        finally
          MyJPEG.Free;
        end;
      end;
      

  2.   

    我试了上面的代码,不行提交时出错.'bitmap image is not a voild
    '
      

  3.   

    只能存储bmp图像,不支持jpg图像
      

  4.   

    bitmap只能存储bmp图像,不支持jpg图像
      

  5.   

    我知道了啊,在你的开头的uses里面加一个jpeg
    那么就不会出错啦!!
    肯定ok,的
      

  6.   

    unit中添加jpeg单元就是这个,肯定对!
      

  7.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      ExtCtrls, DBCtrls, Grids, DBGrids, Db, ADODB,jpeg, StdCtrls,dbtables;
       {一定要USES JPEG单元,使能存储JPG文件格式}
    type
      TForm1 = class(TForm)
        DataSource1: TDataSource;
        ADOQuery1: TADOQuery;
        DBGrid1: TDBGrid;
        DBNavigator1: TDBNavigator;
        Image1: TImage;
        savebutton: TButton;
        showbutton: TButton;
        OpenDialog1: TOpenDialog;
        ADOQuery1id: TIntegerField;
        ADOQuery1pic: TBlobField;
        procedure savebuttonClick(Sender: TObject);
        procedure showbuttonClick(Sender: TObject);
        procedure DBNavigator1Click(Sender: TObject; Button: TNavigateBtn);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}function JpegStartsInBlob(PicField:TBlobField):integer;
       var
        ghy: TADOBlobstream;
        buffer:Word;
        hx: string;
       begin
        Result := -1;
        ghy := TADOBlobstream.Create(PicField, bmRead);
        try
         while (Result = -1) and (ghy.Position + 1 < ghy.Size) do
         begin
          ghy.ReadBuffer(buffer, 1);
          hx:=IntToHex(buffer, 2);
          if hx = ’FF’ then begin
           ghy.ReadBuffer(buffer, 1);
           hx:=IntToHex(buffer, 2);
          if hx = ’D8’ then Result := ghy.Position - 2
           else if hx = ’FF’ then
                 ghy.Position := ghy.Position-1;
          end; //if
         end; //while
         finally
          ghy.Free
         end;  //try
       end;
    procedure TForm1.savebuttonClick(Sender: TObject);
    var
    picstream:tadoblobstream;
    begin
    adoquery1.edit;
    picstream:=tadoblobstream.Create(tblobfield(adoquery1.fields[1]),bmWrite);
    if form1.opendialog1.execute then
    begin
    picstream.LoadFromFile(opendialog1.filename);
    picstream.Position:=0;
    adoquery1.edit;
    tblobfield(adoquery1.Fields[1]).loadfromstream(picstream);
    adoquery1.post;
    end;
    end;procedure TForm1.showbuttonClick(Sender: TObject);
    var
    ghy:TADOBlobstream;
    pic:tjpegimage;
    begin
    ghy := TADOBlobstream.Create(Adoquery1pic, bmRead);
    try
      ghy.Seek(JpegStartsInBlob(Adoquery1pic),soFromBeginning);
      Pic:=TJpegImage.Create;
      try
       Pic.LoadFromStream(ghy);
       Image1.Picture.Graphic:=Pic;
      finally
       Pic.Free;
      end;
    finally
    ghy.Free
    end;
    end;procedure TForm1.DBNavigator1Click(Sender: TObject; Button: TNavigateBtn);
    begin
    if button in [nbFirst, nbPrior, nbNext, nbLast] then showbutton.Click;
    end;end.希望能帮上忙!
      

  8.   

    转贴 看看对你有没有什么帮助吧!
    如何实现在MS Access数据库中图像的存储和显示
    一、 原理介绍——流式数据的类型及其应用
    在Dephi中提供了TStream来支持对流式数据的操作。TStream是万流之源,但由于它是一个抽象类,故不能被直接使用;而要使用其相应的子类,如:TFileStream 、TStringStream、TMemoryStream、TBlobStream、TWinSocketStream和TOleStream。TStream提供了统一、简洁的方法来进行数据的读写。
      1.)SaveToStream(Stream: TStream );  作用:将类中的数据写到Stream的当前位置中 
      2.)LoadFromStream(Stream: TStream);  作用:从当前位置读入Stream里的数据 
      实际使用时我们基本上只要使用上面两个函数就可以了。 
    二、所遇到的问题及相应的解决方法
    为了节省图像的存储空间和使用更加方便,决定采用JPEG这种图像格式。
    (一)所遇到的问题
    第一、在Delphi 5中进行画图所用到的组件是TImage,所生成的图像的格式为BMP格式,而为了节省图像的存储空间,图像在数据库里存储的格式须为JPEG格式,这样就产生了图像格式转化的需求;而TImage本身并不直接提供这两种图像格式之间的转化。
    第二、怎样将存储在Microsoft Access数据库中的图像取出并且显示出来:在Delphi 5中,能提供这种功能的组件是TDBImage,但该组件却存在着一个很大的缺陷:它所能显示的图像类型只能是一些图标文件,元文件和BMP文件,而不能支持JPEG格式的图像在该组件中的显示;但根据实际需要,在Microsoft Access数据库中所存储的图像数据却是以JPEG格式保存的。
    (二)相应的解决方法
    为了解决上述两个问题,可以采用目前数据库中一种名为大二分对象(BLOB——Binary Large Object),它是用来处理某些特殊格式的数据的。BLOB在数据库的表中实际上是以二进制数据的形式存放的。
    为了处理BLOB字段,可以借鉴一些可视的桌面数据库的方法。在这里,我们选择了通过内存流的方式来完成;使用内存流,可减少磁盘操作,大大提高运行效率。
    具体的过程和相关的程序代码如下:
    1、如何实现在Microsoft Access数据库中的图像存储:
    这里是利用TStream的子类TMemoryStream向Microsoft Access数据库中存储图像的。下面的这段代码是在按了“保存”按钮之后所触发的事件处理程序:
    procedure TForm1.Button1Click(Sender: TObject);
    var 
    MyJPEG : TJPEGImage;
    MS: TMemoryStream;
    begin
    MyJPEG := TJPEGImage.Create;
     try
        with MyJPEG do
        begin
          Assign(Image.Picture.Graphic);
          MS:=TMemoryStream.create;
          SaveToStream(MS);
          MS.Position:=0;
                    Table1.Edit;
                     TBlobField(Table1.FieldbyName('Image')).LoadFromStream(MS);
                     Table1.Post;
                     messagebox(getactivewindow(),'图像保存完毕!','保存',mb_ok);          
        end;
      finally
        MyJPEG.Free;
      end;
    end;
    在这段代码里TStream的子类TMemoryStream利用内存流起到了将BMP格式转化为JPEG格式的中间桥梁的作用。
    2、如何将图像从Microsoft Access数据库中取出并显示出来:
    下面的这段代码是在按了“查看图像”按钮之后所触发的事件处理程序:
    procedure TForm1.Button1Click(Sender: TObject);
    var tempstream:TStringStream;
       tempjpeg:TJPEGImage; 
    begin
       try
            tempstream:=TStringStream.Create(' ');     
            TBlobField(Query1.FieldByName('Image')).SaveToStream(tempstream);            
            tempstream.Position:=0;
            tempjpeg:=TJPEGImage.Create;
            tempjpeg.LoadFromStream(tempstream);
            DBImage1.Picture.Bitmap.Assign(tempjpeg);
      finally
            tempstream.Free;
            tempjpeg.Free;
      end;
    end;
    这段代码的主要作用是:首先将查询结果中的JPEG图像格式数据保存到TStringStream中去,然后设置数据指针在TStringStream中的位置为0;接着从TStringStream中读入相关数据,并把它们赋给TDBImage.Picture.Bitmap,这样一来就实现了将数据库中所存储的JPEG格式的数据转化为BMP格式,并在TDBImage中将图像显示出来。最后将TStringStream和TJPEGImage这两个对象释放掉。特别要注意的是不能在设计阶段设置TDBImage的DataField属性,而只能通过写代码的形式在运行阶段把利用流式数据所转化过来的新格式的图像数据赋给TDBImage.Picture.Bitmap。
      

  9.   

    DELPHI存取JPEG文件到SQL Server数据库
                               高红岩(ghyghost)
     
      近日笔者书写一个小型的学生管理系统时,需要用到ADO控件存取SQL Server数据库图片,查看资料发现基本都是针对BMP文件进行操作(巨增数据库大小),但发现了★eagletian★高手翻译的ADO英文技术文档,里面涉及到了数据库存取JPEG文件的关键技术,在win98+sql server桌面版中测试通过,运行良好,现于源码公开如下:
    unit Unit1; 
    interface 
    uses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    ExtCtrls, DBCtrls, Grids, DBGrids, Db, ADODB,jpeg, StdCtrls,dbtables;
    {一定要USES JPEG单元,使能存储JPG文件格式}
    type
    TForm1 = class(TForm)
    DataSource1: TDataSource;
    ADOQuery1: TADOQuery;
    DBGrid1: TDBGrid;
    DBNavigator1: TDBNavigator;
    Image1: TImage;
    savebutton: TButton;
    showbutton: TButton;
    OpenDialog1: TOpenDialog;
    ADOQuery1id: TIntegerField;
    ADOQuery1pic: TBlobField;
    procedure savebuttonClick(Sender: TObject);
    procedure showbuttonClick(Sender: TObject);
    procedure DBNavigator1Click(Sender: TObject; Button: TNavigateBtn);
    private
    { Private declarations }
    public
    { Public declarations }
    end;var
    Form1: TForm1;implementation{$R *.DFM}function JpegStartsInBlob(PicField:TBlobField):integer;
    var
    ghy: TADOBlobstream;
    buffer:Word;
    hx: string;
    begin
    Result := -1;
    ghy := TADOBlobstream.Create(PicField, bmRead);
    try
    while (Result = -1) and (ghy.Position + 1 < ghy.Size) do
    begin
    ghy.ReadBuffer(buffer, 1);
    hx:=IntToHex(buffer, 2);
    if hx = 'FF' then begin
    ghy.ReadBuffer(buffer, 1);
    hx:=IntToHex(buffer, 2);
    if hx = 'D8' then Result := ghy.Position - 2
    else if hx = 'FF' then
    ghy.Position := ghy.Position-1;
    end; //if
    end; //while
    finally
    ghy.Free
    end; //try
    end;
    procedure TForm1.savebuttonClick(Sender: TObject);
    var
    picstream:tadoblobstream;
    begin
    adoquery1.edit;
    picstream:=tadoblobstream.Create(tblobfield(adoquery1.fields[1]),bmWrite);
    if form1.opendialog1.execute then
    begin
    picstream.LoadFromFile(opendialog1.filename);
    picstream.Position:=0;
    adoquery1.edit;
    tblobfield(adoquery1.Fields[1]).loadfromstream(picstream);
    adoquery1.post;
    end;
    end;procedure TForm1.showbuttonClick(Sender: TObject);
    var
    ghy:TADOBlobstream;
    pic:tjpegimage;
    begin
    ghy := TADOBlobstream.Create(Adoquery1pic, bmRead);
    try
    ghy.Seek(JpegStartsInBlob(Adoquery1pic),soFromBeginning);
    Pic:=TJpegImage.Create;
    try
    Pic.LoadFromStream(ghy);
    Image1.Picture.Graphic:=Pic;
    finally
    Pic.Free;
    end;
    finally
    ghy.Free
    end;
    end;procedure TForm1.DBNavigator1Click(Sender: TObject; Button: TNavigateBtn);
    begin
    if button in [nbFirst, nbPrior, nbNext, nbLast] then showbutton.Click;
    end;end.如果数据库中要存储的是BMP文件,则在procedure TForm1.showbuttonClick(Sender: TObject);过程中代码更改如下即可存储显示BMP文件格式的操作。
    procedure TForm1.showbuttonClick(Sender: TObject);
    var
    ghy:TADOBlobstream;
    pic:tbitmap;
    begin
    ghy := TADOBlobstream.Create(Adoquery1pic, bmRead);
    try
    { ghy.Seek(JpegStartsInBlob(Adoquery1pic),soFromBeginning);}
    Pic:=Tbitmap.Create;
    try
    Pic.LoadFromStream(ghy);
    Image1.Picture.Graphic:=Pic;
    finally
    Pic.Free;
    end;
    finally
    ghy.Free
    end;
    end;
      到此用DELPHI存取JPEG文件到SQL Server数据库中的具体操作已经叙述完毕。
      

  10.   

    DELPHI存取JPEG文件到SQL Server数据库(续文) 
                               高红岩(ghyghost) 
      在"DELPHI存取JPEG文件到SQL Server数据库"发表之后,有许多网友来电表示支持和相关的技术咨询,在此首先对那些关心本文的朋友们表示衷心的感谢。
      由于网友的需要做一个档案管理系统,存取jpeg文件到sql 2000数据库中,但在dbimage中及qrdbimage中均不能正常显示jpeg的文件,此为borland的限制,虽然使用第三方控件能达到要求,但我们还是来原始的实现一下这方面的技术,其实原理十分简单,既然我们在"DELPHI存取JPEG文件到SQL Server数据库"能存储jpeg文件,也能在image中显示,但一接触db类的图象显示控件就行不通了,我们可以在jpeg文件存入数据库之前转换成bmp文件再存入数据库即可,程序运行环境delphi5+ado+sql 2000桌面版+win98se2最终版,数据库中存放图片字段的类型为image,程序源代码如下: 
    unit Unit1;interfaceuses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    Db, DBCtrls, Grids, DBGrids, ADODB, ExtDlgs,jpeg, ExtCtrls, StdCtrls;type
    TForm1 = class(TForm)
    ADOConnection1: TADOConnection;
    ADOQuery1: TADOQuery;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    DBImage1: TDBImage;
    ADOQuery1ID: TStringField;
    ADOQuery1FIELD: TStringField;
    ADOQuery1STYLE: TStringField;
    ADOQuery1SYSTEM: TStringField;
    ADOQuery1DATE: TDateTimeField;
    ADOQuery1PERSON1: TStringField;
    ADOQuery1PERSON2: TStringField;
    ADOQuery1PERSON3: TStringField;
    ADOQuery1PHOTO: TBlobField;
    ADOQuery1DESCRIPTION: TStringField;
    OpenPictureDialog1: TOpenPictureDialog;
    Image1: TImage;
    Button1: TButton;
    Memo1: TMemo;
    procedure DBImage1Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
    private
    { Private declarations }
    public
    { Public declarations }
    end;var
    Form1: TForm1;implementation{$R *.DFM}procedure TForm1.DBImage1Click(Sender: TObject);
    var
    picstream:tadoblobstream;
    bmppic:tbitmap;
    jpgpic:tjpegimage;
    bmpstream:TMemoryStream;
    begin
    if form1.OpenPictureDialog1.Execute then
    begin
    if extractfileext(form1.openpicturedialog1.filename)='.bmp' then
    begin
    adoquery1.edit;
    picstream:=tadoblobstream.Create(tblobfield(ADOQuery1PHOTO),bmWrite);
    //注:上句代码中的ADOQuery1PHOTO是adoquery1中的固定字段photo的固定字段的name
    //用户需要手工添加固定字段,也可用fields[i]来进行选择,这点在
    //"DELPHI存取JPEG文件到SQL Server数据库"这篇文章中没有注释,至使许多朋友没有
    //编译成功。
    picstream.LoadFromFile(openpicturedialog1.filename);
    picstream.Position:=0;
    adoquery1.edit;
    tblobfield(ADOQuery1PHOTO).loadfromstream(picstream);
    adoquery1.post;
    adoquery1.edit;
    picstream.free;
    end
    else
    begin
    jpgpic:=tjpegimage.Create;
    bmppic:=tbitmap.Create;
    bmpstream:=tmemorystream.Create;
    jpgpic.LoadFromFile(openpicturedialog1.filename);
    bmppic.Assign(jpgpic);
    bmppic.SaveToStream(bmpstream);
    adoquery1.edit;
    picstream:=tadoblobstream.Create(tblobfield(ADOQuery1PHOTO),bmWrite);
    //注:上句代码中的ADOQuery1PHOTO是adoquery1中的固定字段photo的固定字段的name
    //用户需要手工添加固定字段,也可用fields[i]来进行选择,这点在
    //"DELPHI存取JPEG文件到SQL Server数据库"这篇文章中没有注释,至使许多朋友没有 
    //编译成功。
    picstream.LoadFromStream(bmpstream);
    picstream.Position:=0;
    adoquery1.edit;
    tblobfield(ADOQuery1PHOTO).loadfromstream(picstream);
    adoquery1.post;
    jpgpic.free;
    bmppic.free;
    bmpstream.free;
    adoquery1.edit;
    picstream.free;
    end;
    end; 
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
    memo1.Lines.Add(form1.openpicturedialog1.filter);
    end;procedure TForm1.FormShow(Sender: TObject);
    begin
    form1.openpicturedialog1.filter:='All *.jpg;*.jpeg;*.bmp;|*.jpg;*.jpeg;*.bmp;)';
    end;end.至此实现的功能代码如上所例,希望能对需要这方面资料的朋友有所帮助.
    我的联系方式为:Email:[email protected] 
    个人主页:http://delphijl.99898.com(吉林delphi开发网)
      

  11.   

    续文执行效率不好只是变通做法
    到网上到一个能支持JPEG的DBIMAGE控件来进行程序的设计
      

  12.   

    我有源代码的,要的话:[email protected]写信给我,我发给你
      

  13.   

    呵呵,我最今也是在做一个多媒体数据库的项目。
    假如有一种通用的方法可以存储其它的BLOB对象就好了