写法1:
     imagejpg.LoadFromFile(image.Hint);
     imagebmp.Picture.Bitmap.Assign(imagejpg);
     dataset.Fields[8].Assign(imagebmp.Picture);
对上写法优化后,变成294K
写法2:
          Image.picture.LoadFromFile( image.Hint );
            if Image.picture <> NIL then
             begin
               Image.picture.SaveToClipboardFormat(MyFormat, AData,APalette);
               DBIMG.Picture.LoadFromClipboardFormat(MyFormat, AData,APalette);
             end;
各位大侠,谁还有更佳写法?望赐教!附开发环境:windows2000server+sqlserver2000+delphi6

解决方案 »

  1.   

    是这样的,我采用以上不同方法通过对同一幅图片delphi做后台维护后,从WEB查询网页,显示图片后选择另存为...
      

  2.   

    >>imagebmp.Picture.Bitmap.Assign(imagejpg);
    你又將 jpg 圖片轉成 bmp, 當然文件會改大了!
    所以, 你直接將文件用流的方式存進去就可了!
      

  3.   

    楼上说的对,JPG 另存为 BMP 就会变大的。
      

  4.   

    存到数据库
    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;
    我参照此代码改写了原程序,但提示错误:系统提示
    bitmap image is not valid请问怎么解决!!!!
      

  5.   

    万分感激aiirii(aiirii)指点迷津,尤其是你的留言一语惊醒梦中人:
    你可能将 dbimage之类的数据感知控件与该字段绑定了, 但该类型控件只支持bmp类,所以会出错, 你现在的情况, 要么接收bmp大好几十倍的存储, 要么,要自己编写解码,从bmp 到jpg, 然后再到控件的显示!! 去掉dbimage之类的数据感知控件(只支持bmp),^_^,搞定
     
      

  6.   

    procedure TFrmWhole.ShowPic;
    var
      bS  : TADOBlobStream;
      Pic : TJpegImage;
    begin
      bS := TADOBlobStream.Create(adoWholewholepic, bmRead);
      try
        bS.Seek(JpegStartsInBlob(adoWholewholepic),soFromBeginning);
        Pic:=TJpegImage.Create;
        try
          Pic.LoadFromStream(bS);
          Image1.Picture.Graphic:=Pic;
        finally
          Pic.Free;
        end;
      finally
        bS.Free;
      end;
    end;function JpegStartsInBlob(PicField: TBlobField): integer;
    var
      bS     : TADOBlobStream;
      buffer : Word;
      hx     : string;
    begin
      Result := -1;
      bS := TADOBlobStream.Create(PicField, bmRead);
      try
        while (Result = -1) and (bS.Position + 1 < bS.Size) do
        begin
          bS.ReadBuffer(buffer, 1);
          hx:=IntToHex(buffer, 2);
          if hx = 'FF' then
          begin
            bS.ReadBuffer(buffer, 1);
            hx:=IntToHex(buffer, 2);
            if hx = 'D8' then Result := bS.Position - 2
            else if hx = 'FF' then
               bS.Position := bS.Position-1;
          end; //if
        end; //while
      finally
        bS.Free
      end;  //try
    end;