我现在要实现这样一个需求,用户从本地上传一个JPG的图片到数据库。比如图片的大小是(800*600)的,在数据库中要求存储当前图片的缩略图(就是把当前图片压缩到200*100)的大小文件存储到数据库一个叫缩略图的字段里面,同时再把800*600的图片存储到数据库一个叫PHOTO的字段里(存储800*600的我已经实现)。
对于以上需求现在有两个问题:
(1)、如何把800*600的图片压缩成200*100的,在Delphi里面是怎么实现的。
(2)、如果把压缩的图片写入数据库。
(3)、同时在问一个如何获取用户上传jpg图片的大小。
请各位大哥帮帮小弟。

解决方案 »

  1.   

    (1)、如何把800*600的图片压缩成200*100的,在Delphi里面是怎么实现的。
    你可以使用copyrect,把原图片拷贝到一个200*100的画布上,然后入库
    (2)、如果把压缩的图片写入数据库。
    和你800×600的图片入库一样的操作。。关于图片入库,可以参考以前的帖子,你在论坛中搜索一个,关于这个问题,N个帖子。
      

  2.   

    CSDN论坛和delphibbs论坛搜索,有好多资料
      

  3.   

    图片存入数据库:
    http://topic.csdn.net/t/20051215/18/4461795.html
      

  4.   

    参考一下unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, DB, ExtDlgs, StdCtrls, ADODB, Grids, DBGrids, ExtCtrls,jpeg,
      DBCtrls;type
      TForm1 = class(TForm)
        DBGrid1: TDBGrid;
        ADOConnection1: TADOConnection;
        ADOTable1: TADOTable;
        selectimage: TButton;
        savetodb: TButton;
        OpenPictureDialog1: TOpenPictureDialog;
        DataSource1: TDataSource;
        DBNavigator1: TDBNavigator;
        savetofile: TButton;
        Label1: TLabel;
        Label2: TLabel;
        Button1: TButton;
        Bevel1: TBevel;
        Bevel2: TBevel;
        GroupBox1: TGroupBox;
        Image1: TImage;
        Label3: TLabel;
        Label4: TLabel;
        DBImage1: TDBImage;
        procedure selectimageClick(Sender: TObject);
        procedure savetodbClick(Sender: TObject);
        procedure ADOTable1AfterScroll(DataSet: TDataSet);
        procedure savetofileClick(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure ADOTable1BeforeScroll(DataSet: TDataSet);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation
       uses unit2;
    {$R *.dfm}procedure TForm1.selectimageClick(Sender: TObject); //选择图像
    begin
     if openpicturedialog1.Execute then
       image1.Picture.LoadFromFile(openpicturedialog1.FileName );
    end; ////如下保存方法only to sql and access'data
    procedure TForm1.savetodbClick(Sender: TObject);  //保存图像
    var
      strm:tmemorystream;
      ext:string;
    begin
       if image1.picture.Graphic <> nil then  //避免image1中无图像保存出错
       begin
       ext:=extractfileext(openpicturedialog1.FileName );
       strm := tmemorystream.Create ;
       try
       image1.Picture.Graphic.SaveToStream(strm);
       adotable1.Edit ;
       strm.Position :=0;
       DBImage1.dataField :='';  //dbimage只能显示BMP,否则myimage由BMP变为jpeg时会出错
       tblobfield(adotable1.FieldByName('myimage')).LoadFromStream(strm);
       //如需直接由文件保存 TBlobField(adotable1.FieldByName('myimage')).LoadFromFile(OpenPictureDialog1.FileName);
       //以下记录保存到数据库的图像格式
       if uppercase(ext) = '.BMP' then
       begin
       adotable1.FieldByName('isbmp').Value := 1;
       dbimage1.dataField := 'myimage';
       end
       else if (uppercase(ext) = '.JPG') OR ( uppercase(ext) = '.JPEG') THEN
       adotable1.FieldByName('isbmp').Value := 0;
       adotable1.Post ;
       finally
       strm.Free ; //如果你选用TBLOBSTREAM类,程序运行到此语句会出错,可该语句前添入adotable1.edit
       end;
       end;
    end;
     ///如下显示方法不适用于paradox中的graphic字段的显示。
    procedure TForm1.adoTable1AfterScroll(DataSet: TDataSet);  //显示图像
    var
    strm:tadoblobstream;
    jpegimage:tjpegimage;
    bitmap:tbitmap;
    begin
      strm := tadoblobstream.Create(tblobfield(adotable1.fieldbyname('MYIMAGE')),bmread);
      try    //try1
      strm.position :=0;
      image1.Picture.Graphic := nil;
      DBIMAGE1.DataField := '';
      //显示时,BMP、JPEG两种图像数据必需分别处理
      if adotable1.fieldbyname('isbmp').asstring ='1' then
        begin    //begin11
        bitmap := tbitmap.Create ;
        try     //try11
        bitmap.LoadFromStream(strm);
        image1.Picture.Graphic := bitmap;
        DBIMAGE1.DataField := 'myimage';
        finally
        bitmap.Free;
        end;    //end try11
        end     //end begin11
        else if adotable1.fieldbyname('isbmp').asstring ='0' then
        begin   //begin12
        jpegimage := tjpegimage.Create ;
        try     //try12
        jpegimage.LoadFromStream(strm);
        image1.Picture.Graphic := jpegimage;
        finally
        jpegimage.Free ;
        end;    //end try12
        end;    //end begin12
      finally
      strm.Free ;
      end;     //end try1
    end;////显示时必须分bmp and jpeg 两种情况处理,而保存可统一。procedure TForm1.savetofileClick(Sender: TObject);
    var
      tmpstr:string;
    begin
       if image1.Picture.Graphic <> nil then
       begin
       tmpstr := openpicturedialog1.Filter;
       if adotable1.fieldbyname('isbmp').asstring ='1' then
       begin
       openpicturedialog1.Filter := 'Bitmaps (*.bmp)|*.bmp';
       if openpicturedialog1.Execute then
      image1.Picture.SaveToFile(openpicturedialog1.FileName+'.bmp');
      end
      else
      begin
       openpicturedialog1.Filter := 'JPEG Image File (*.jpg)|*.jpg';
       if openpicturedialog1.Execute then
      image1.Picture.SaveToFile(openpicturedialog1.FileName+'.jpg');
      end;
      openpicturedialog1.Filter := tmpstr;
      end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      form2.Show;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      adoconnection1.Connected := true;
      adoconnection1.LoginPrompt := false;
      adotable1.Active := true;
      
    end;procedure TForm1.ADOTable1BeforeScroll(DataSet: TDataSet);
    begin
      dbimage1.dataField :='';  //这条语句不能遗漏,不信你试试
    end;end.
      

  5.   

    function Taddmtsc.GetDirectorySize(const ADirectory: string): Integer; //获取文件大小
    var
      Dir: TSearchRec;
      Ret: integer;
      Path: string;
    begin
      Result := 0;
      Path := ExtractFilePath(ADirectory);
      Ret := Sysutils.FindFirst(ADirectory, faAnyFile, Dir);
      if Ret <> NO_ERROR then exit;
      try
        while ret = NO_ERROR do
        begin
          inc(Result, Dir.Size);
     //如果是目录,且不是'.'或'..'则进行递归调用      if (Dir.Attr in [faDirectory]) and (Dir.Name[1] <> '.') then
            Inc(Result, GetDirectorySize(Path + Dir.Name + '\*.*'));
          Ret := Sysutils.FindNext(Dir);
        end;
      finally
        Sysutils.FindClose(Dir);
      end;end;
    function Taddmtsc.GetFileExtension(const sFileName: string): string; //获取文件格式
    begin
      Result := Copy(sFileName, Length(sFileName) - 2, 3);
    end;
    procedure Taddmtsc.uploadClick(Sender: TObject);
    var
      fnOle: string;
      function BlobContentToString(const sFileName: string): string;
      begin
        with TFileStream.Create(sFileName, fmOpenRead) do
        begin
          try
            SetLength(Result, Size);
            Read(Pointer(Result)^, Size);
          finally
            Free;
          end;
        end;
      end;begin
      if (OpenDialog1.Execute) then
      begin
        if dbedit1.Text = '' then
        begin
          showmessage('资源信息不完整,上传失败!');
          ComboBox4.Enabled := false;
          exit;
        end
        else
          if dbedit1.Enabled <> true then
          begin
            showmessage('操作错误,上传失败!');
            ComboBox4.Enabled := false;
            exit;
          end
          else
          begin
            fnOle := OpenDialog1.FileName;
            dm1.ADODataSet1.Edit;
            dm1.ADODataSet1.FieldByName('data').AsString := BlobContentToString(fnOle);
            dm1.ADODataSet1.FieldByName('subject_3_id').Value := DBEdit1.Text;
            dm1.ADODataSet1.FieldByName('format').Value := GetFileExtension(fnOle);
            dm1.ADODataSet1.FieldByName('time').Value := Now;
            dm1.ADODataSet1.FieldByName('size').Value := GetDirectorySize(fnOle);
            dm1.ADODataSet1.FieldByName('kind').Value := ComboBox4.Text;
            dm1.ADODataSet1.FieldByName('user').Value := userlogin.Query1name.Text;
            dm1.ADODataSet1.Post;
            flag:=0;
            showmessage('资源上传成功!');
          end;
        DBMemo1.Enabled := false;
        ComboBox1.Enabled := false;
        ComboBox2.Enabled := false;
        ComboBox3.Enabled := false;
        ComboBox4.Enabled := false;
        dbedit6.Enabled := false;
        dbedit1.Enabled := false;
        BitBtn1.Enabled := true;
        BitBtn2.Enabled := true;
        BitBtn3.Enabled := true;
        BitBtn4.Enabled := true;
        BitBtn6.Enabled := true;
        BitBtn8.Enabled := true;
        back1.Enabled := true;
        look1.Enabled := true;
        addnew.Enabled := true;
      end;
    end;
    以上是本人用过的上传二进制流文件的方法,你可以参考一下(别说图片了,就是影音文件也没问题的)