怎么样读写bmp,jpg,gif类型,一:存入sql server,二:从sql server读出显示在Timage上面

解决方案 »

  1.   

    字段类型为Bolb,用DBIMAGE就可以直接读写
      

  2.   

    我正在做这个呢 一 有个语句,我回去帮你看一下,用一条语句就可以二 用一个dbimage控件,数据源可以设定为表或query,随你的便了,在fildname中设定你image字段的名称。然后将数据源启动就可以了
      

  3.   

    http://expert.csdn.net/Expert/topic/1222/1222691.xml?temp=.6995661
      

  4.   

    参考delphi6\demo\frames\db\framesdemo.dpr
      

  5.   

    几位大侠,我的题目是怎么样读写bmp,jpg,gif类型,一:存入sql server,二:从sql server读出显示在Timage上面,并非只有bmp的
      

  6.   

    1class3000里有fcdbimage控件,可以读写jpeg,ico,bmp...控件
      

  7.   

    也可以不用dbimage控件,用image控件也可以,假设字段名为photo,照片名为'C:\aa.jpg'向数据库写图片的语句
    ADODataSet1.Open;
    ADODataSet1.Edit;
    TBlobField(ADODataSet1.FieldByName('photo')).LoadFromFile('C:\aa.jpg');
    ADODataSet1.Post;从数据库中读图片
    ADODataSet1.Open;
    TBlobField(ADODataSet1.FieldByName('photo')).SaveToFile('C:\aa.jpg');
    Image1.Hide;
    Image1.Picture.LoadFromFile('C:\aa.jpg');
    Image1Show;以上代码在delphi6+oracle8.1.6中通过测试
      

  8.   


    var
      MS:TMemoryStream;
    begin
        MS:=TMemoryStream.create;
        image1.Picture.Bitmap.SaveToStream(MS);
        MS.Position:=0;
        adoquery1.Insert;
        TBlobField(adoquery1.FieldbyName('tp')).LoadFromStream(MS);
        adoquery1.Post;
    end;
      

  9.   

    上述方法可以存取各种图片文件,也适用于sqlserver数据库,如果有什么问题,发贴给我
      

  10.   

    to hempweed(萧萧) 
    问题是各种图片都存的,不知道是jpg,bmp还是gif的
    TBlobField(ADODataSet1.FieldByName('photo')).SaveToFile('C:\aa.jpg');如果是bmp或者gif就不可以了
    请再指教一下
    to allan2002(丸子) 
    存入是可以的,现在想取出来,谢谢再考虑一下
      

  11.   

    那就不行了,你应该在数据库中再加入一个字段,标明存入的是jpg,bmp还是gif,存入和读取的时候先查看照片属性,然后判断用响应的语句
    TBlobField(ADODataSet1.FieldByName('photo')).SaveToFile('C:\aa.jpg');
    TBlobField(ADODataSet1.FieldByName('photo')).SaveToFile('C:\aa.bmp');
    TBlobField(ADODataSet1.FieldByName('photo')).SaveToFile('C:\aa.gif');
      

  12.   

    但对于各种图像来说,他们都是二进制代码!所以一视同仁!TBlobField()就是类型强制转化!用TMemoryStream就是利用流在中间过渡,因为对于TImage,TBitmap,TPicture,TJPEGimage来说都有LoadFromStream!自己在论坛中查询下吧,就今年来说,这问题就提了几百遍了!其实关键在于你能不能理解代码的意思,别人光给代码没用!
      

  13.   

    各种图象文件是都是二进制代码,但是如果你存进去的是bmp文件,读出来的时候文件名也要是.bmp,否则是不行的
      

  14.   

    ehom(?!) 大侠,如果有什么高见,不妨发表一下?
      

  15.   

    给你点不是我写的参考
    //查看图片
    procedure TDM.ViewPhoto(ImagX:TImage;FiledX:TBlobField);
    var
        B:Tbitmap;
        JpegImage:TJpegImage;
        BS:TBlobStream;
    begin
        ImagX.Picture.Assign(nil);
        if not FiledX.IsNull then begin
            try//如果是Jpeg格式
               BS := TBlobStream.Create(TBlobField(FiledX), bmRead);
               JpegImage := TJpegImage.Create;
               JpegImage.JPEGNeeded;
               JpegImage.LoadFromStream(BS);
               ImagX.Picture.Assign(JpegImage);
               JpegImage.Free;
               BS.Free;
            except//如果是BMP格式
               BS := TBlobStream.Create(TBlobField(FiledX), bmRead);
               B:=Tbitmap.Create;
               b.LoadFromStream(BS);
               ImagX.Picture.Assign(b);
               B.Free;
               BS.Free;
            end;
        end;
    end;
    //保存图片
    use jpeg,Clipbrd、、、、、、、、、、、、、
    //Save to database
    Image1.Picture.LoadFromFile('FileName');
    if not (Image1.Picture.Graphic Is TBitmap) then
    begin
      ClipBoard.Assign(Image1.Picture);
      Image1.Picture.Bitmap.Assign(ClipBroad);
      ClipBoard.Clear;
    end;//Change the picture that's not belonged to .bmp to .bmp
        // picture 
    Table1.Edit;
    Table1.FieldByName('Image').Assign(Image1.Picture);
    Table1.Post;
    //get from database
    Image1.Picture.Bitmap.Assign(TPicture(Table1.FieldByName('Image')));
    一般来说DBimage控件用来读取图象数据比较方便,但保存时就比较麻烦,建议使用image
    例:procedure TForm1.ButtonClick(Sender:TObject)
        Var
        Picture1:Tpicture;
        begin
          Picture1:=Tpicture.Create;
          try
            try
             if FileExists(Edit1.text) then
              with  table1 do
                begin
                   Picture1.loadFromFile(Edit1.text);
                   if FindKey([ExtractFilename(edit1.text)])=False then
                    begin
                      IndexfieldNames:='Names';
                      Table1.Insert;
                      Fields[0].asstring:=ExtractFileName(Edit1.text);
                      Fields[1].Asstring(Picture1);
                      Showmessage('ok!!');
                     end
                  else
                  showmessage('no!');
                    end; 
         finally
             picture1.Free;
                
         end;
      Except
        showmessage('no!');
      end;
        end;
      

  16.   

    取出来的话用dbimage就可以了!
    如果要用image的话,把存入代码改一下就好了!
    同意 ehom(?!) 的看法!我发现,现在的程序员都不去了解深层方面的原理,要不就是找代码,用控件,我觉得这样虽然能够解决问题,但无法解决根本的问题!起不到举一反三的作用
      

  17.   

    先谢谢各位,toehom(?!)andallan2002(丸子):  光有LoadFromStream知道到时显示什么格式了吗?gif可以吗?说点实在的东西,写写代码,光说谁都会啊,谢谢
      

  18.   

    ehom(?!):从流中取前几个字节?怎么取?取出以后怎么判断?利用异常机制能适用比如gif图片吗?具体一点如何?3ks
      

  19.   

    MS:TMemoryStream;
    begin
        MS:=TMemoryStream.create;
        image1.Picture.Bitmap.SaveToStream(MS);
        MS.Position:=0;
        adoquery1.Insert;
        TBlobField(adoquery1.FieldbyName('tp')).LoadFromStream(MS);
        adoquery1.Post;
    end;丸子说的 有效!!!
    我 用过
      

  20.   

    其实你从英文的字面意思上就可以理解!
    var Buffer:Word;Stream.Seek (0, soFromBeginning);
    Stream.Read(Buffer,4);异常机制对GIF当然有效,什么是异常?就是打不开出错!不过如果该解析GIF的类在不是GIF格式时不抛出异常,认为它不错,我也没办法!你找编该控件的作者算帐吧!
      

  21.   

    关于图片的存取最满意的答复莫过于 devil(通吃) 。
    楼上,斑竹大人记得我吧?你以关键字“图片存取”搜索大类小类。看看有几个帖子是能打开的?虽然问题问过很多次,但能看到答案的还真不多!
      

  22.   

    其实devil(通吃)的方法我发贴之前已经试过,对jpg,bmp不失一个一个方法,主要是gif什么的TImage是不会支持的.不知道有何解决方法?除非自己写控件?
    l_xiaofeng(流水不腐) = 楼晓峰??
      

  23.   

    如果自己不会写用现成的TGifImage!用www.google.com很容易找到!
      

  24.   

    在数据源的onchange事件中调用如下的showpicture过程。
    参数说明:
    img:你要显示图片的image。
    adoq:数据集。
    field:包含图片的字段。
    附保存图片的过程,也许有用哦,嘻嘻。procedure showpicture(img: Timage; ADOQ: TADOQuery; field: string);
    var MS: Tmemorystream;
    begin
      if not ADOQ.FieldByName(field).isnull then
        begin
          MS := TMemoryStream.Create;
          try
            TBlobField(ADOQ.FieldByName(field)).SaveToStream(MS);
            MS.Position := 0; //注意
            try
              img.Picture.Graphic.LoadFromStream(MS);
            except
              //如果格式无效,则显示默认图片
              on EInvalidGraphic do
              img.Picture.Graphic := fmain.Image4.Picture.Graphic;
            end;
          finally
            MS.Free;
          end;
        end
      else
        begin
          MS := TMemoryStream.Create;
          try
            fmain.Image4.Picture.Graphic.SaveToStream(MS);
            MS.Position := 0; //注意
            img.Picture.Graphic.LoadFromStream(MS);
          finally
            MS.Free;
          end;
        end;
    end;procedure savepicture(img: Timage; ADOQ: TADOQuery; field: string);
    var photo: Tmemorystream;
    begin
       photo := Tmemorystream.create;
       img.Picture.graphic.savetoStream(photo);
       Tblobfield(ADOQ.FieldByName(field)).loadfromstream(photo);
       photo.Clear;
    end;
      

  25.   

    TO:hzsummer(卖女孩的小火柴) 错!是刘晓峰!