我的数据库中Blob字段中存有图像的字节数据,每个图像有256*300字节。
请问如何快速取出数据并能以最快的速度显示?不是数据库图像显示控件
那种。

解决方案 »

  1.   

    可以动态建立一个form以及一个image控件,bmp格式直接显示,jpg转换成流形式再显示.这样的速度已经构快了,我试过,每秒钟可以显示20多张图片(640*480),不过跟机子配置有关系,不知这样的速度是否满意?
      

  2.   

    var
    pjpg:tjpegimage;
    pic:TMemoryStream;
    begin
    pjpg:=tjpegimage.Create;
    pjpg.LoadFromFile(F:\JPG.jpg);
    pic:=TMemoryStream.Create;
    pjpg.SaveToStream(pic);
    pic.Position:=0;
    TBlobField(dataset.FieldByName('Img')).LoadFromStream(pic);
    dataset.post;
    pic.Free;
    pjpg.free;
    end;
    从数据库取出
    var
    pjpg:tjpegimage;
    pic:TMemoryStream;
    begin
    pjpg:=tjpegimage.Create;
    pic:=TMemoryStream.Create;
    TBlobField(dataset.FieldByName('Img')).savetoStream(pic);
    pic.positon:=0;
    pjpeg.LoadFromStream(pic);
    image.graphi.bmp.assign(pjpeg);
    end;end;
      

  3.   

    没有您们说的那么容易,我不仅要取图片,还要跟其它的图片对比,是否是同张图片,
    如指纹识别。我的意思是如何把字节数据快速转化为图像像素,并快速显示。blob字段中
    存放的是256*300字节的颜色值。我的处理是如下,显示很慢:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      longstr,longstr1:ansistring;
      size,C,m,wd,lg:integer;
      tmpstr:string;
      Achar:array of char;
      pchar1:pchar;
      textfile1:textfile;
      clr:integer;
    begin
      if Not adoc1.Connected then
         adoc1.Open;
      with adoqr1 do
      begin
        close;sql.Clear;
        sql.Add('select top 1 * from fingerindex where id=78');
        open;
        if Recordcount>0 then
        begin
          longstr:=TblobField(Fieldbyname('指纹数据')).AsVariant;
          Size:=TBlobField(Fieldbyname('指纹数据')).BlobSize;
          c:=0;m:=0;
          wd:=10;lg:=100;
          if size>0 then
          begin
            setlength(Achar,size);
            longstr1:=longstr;
            While Length(longstr1)>=1  do
            begin
              TmpStr:=Copy(longstr1,1,1);
              pchar1:=Pchar(TmpStr);
              Achar[C]:=pchar1[0];
              if m=256 then
              begin
                 form1.Canvas.Pixels[wd,lg]:=StringToColor('$'+inttoHex(integer(achar[c]),2)+'0000');
                 inc(lg);
                 wd:=10;
                 m:=0;
              end
              else
              begin
                form1.Canvas.Pixels[wd,lg]:=StringToColor('$'+inttoHex(integer(achar[c]),2)+'0000');
                 inc(wd);
              end;
              inc(m);
              Inc(C);
              longstr1:=Copy(longstr1,2,Length(longstr1)-1);
            end;
          end;
        end;
      end;
    end;
      

  4.   

    建议你用windows的与设备无关的位图格式bitmap,这样如果你用真彩色就是直接3个字节表示一个像素的颜色,而且3个字节分别是红色,绿色,蓝色,这样你直接就可以在流中进行判断并准确定位出示那里不一样了。
    --------------------------------------
    看!
    那支正飞向太阳的蛾子.....
    就是我!
    --------------------------------------
      

  5.   

    谢谢 firetoucher(风焱) ,但您好像有点答非所问。
    哪位请回答我,我再加100分!
      

  6.   

    sorry
    1 与设备无关的位图格式bitmap格式显示和处理是最快的
    2 如果你的网络不行的话可以考虑压缩以后存储
    3 单就数据库交互存取过程来说,没有什么代码能够提高select速度了,关键是你的处理速度和减少数据量,代码如何可以参看 qwertyasd(昊) 的
    --------------------------------------
    看!
    那支正飞向太阳的蛾子.....
    就是我!
    --------------------------------------
      

  7.   

    1. 这里演示了TMemoryStream的一种用法,将Stream中的数据写到数据库中去。 var
     MS: TMemoryStream;
    begin
     MS:=TMemoryStream.create;
     Image1.Picture.Bitmap.SaveToStream(MS);
     MS.Position:=0;
     Table1.Append;  
    file://在数据库中添加一条记录
     TBlobField(Table1.FieldbyName
    ('image')).LoadFromStream(MS);
     Table1.Post;    
    file://将所作的更新写入数据库
    end;
    2. 这里演示了TBlobStream的用法,使用了和写入时不同的方法来读出数据库的图象数据。 var
     MS: TStream;
    begin
     with Table1 do
     MS:=CreateBlobStream
    (FieldbyName('image'),bmRead);
     Image1.Picture.Bitmap.
    LoadFromStream(MS);
     MS.Free;
    end;