我想实现当图片入库的时候,压缩,调出的时候解压,以供浏览等功能使用,应该如何做呢,压缩的图片如何存到数据库中

解决方案 »

  1.   

    好像又winzip的压缩和解压的方法。
      

  2.   

    存出与存入数据库直接使用TBlobField即可。
    压缩与解压可以使用 zlib单元的 TCompressionStream.
      

  3.   

    var
      mss: TMemoryStream;
      zip: TDeCompressionStream;
      zip1: TCompressionStream;
      fs : TFileStream;
      fBuf: Array[0..16383] of Byte;
      flen: Integer;
      //从数据库中取出图片
      //...写出SQL语句以取得有图片的记录,此处从略  mss := TMemoryStream.Create;
      fs := TFileStream.Create('filename.jpg',fmCreate or fmOpenWrite);
      try
        TBlobField(Que.FieldByName('pic')).SaveToStream(mss);
        zip := TDeCompressionStream.Create(fs);
        try
          flen := zip.Read(fbuf, SizeOf(fBuf));
          while flen > 0 do begin
            fs.Write(fbuf, flen);
            flen := zip.Read(fbuf, SizeOf(fBuf));
          end;
        finally
          FreeAndNil(zip);
        end;
      finally
        mss.Free;
        fs.Free;
      end;  //将文件filename.jpg中的图片保存到数据库
      //...写出SQL语句,打开Que,并定位到要保存图片的记录,此处从略  fs := TFileStream.Create('filename.jpg',fmOpenRead);
      mss := TMemoryStream.Create;
      try
        zip1 := TCompressionStream.Create(clDefault,mss);
        try
          flen := fs.Read(fbuf, SizeOf(fBuf));
          while flen > 0 do begin
            zip1.Write(fbuf, flen);
            flen := fs.Read(fbuf, SizeOf(fBuf));
          end;
          //保存到数据库
         TBlobField(Que.FieldByName('pic')).LoadFromStream(mss);
          Que.UpdateBatch();
          //...
        finally
          zip1.Free;
        end;
      finally
        fs.Free;
        mss.Free;
      end;
      

  4.   

    另:在数据库中,图片字段的类型应为image