做一个类似于dbimage的dbjpeg控件 不能实现吗? 我星期一就要交付运行了. 现在大量的图片影响着系统运行的速度. 我想把全都改为.jpg格式存储, 可以吗? 我现在急需找一个dbjpeg能存.jpg格式的控件

解决方案 »

  1.   

    我是做一地理信息管理,里头有全国各地的地图,且数据全部录入后有十几万条, 我现在用的.bmp格式存储,速度达到了 启动需要  65秒/ 1000条记录  我还用了线程. 
      

  2.   

    //抄书的type
      TMdDbGrid =class (TDbGrid)
      private
        FLinesPerRow:Integer;
        procedure SetLinesPerRow (Value:Integer);
      protected
        procedure DrawColumnCell(const Rect:TRect;DataCol:Integer;
          Column:TColumn;State:TGridDrawState);override ;
        procedure LayoutChanged;override ;
      public
        constructor Create (AOwner:TComponent);override ;
      published 
        property LinesPerRow:Integer read FLinesPerRow write SetLinesPerRow default 1;
      end;
    procedure TMdDbGrid.SetLinesPerRow(Value:Integer);
    begin
      if Value <>FLinesPerRow then
      begin
        FLinesPerRow := Value;
        LayoutChanged;
      end;
    end;procedure TMdDbGrid.Create(AOwner: TComponent); override;
    begin
      inherited;
      FLinesPreRow := 1;
    end;procedure TMdDbGrid.LayOutChanged;
    var
      PixelsPerRow,PixelsTitle,I:Integer;
    begin
      inherited LayOutChanged;
      Canvas.Font :=Font;
      PixelsPerRow :=Canvas.TextHeight(‘Wg ’)+3;
      if dgRowLines in Options then
        Inc (PixelsPerRow,GridLineWidth);
      Canvas.Font :=TitleFont;
      PixelsTitle :=Canvas.TextHeight(‘Wg ’)+4;
      if dgRowLines in Options then
        Inc (PixelsTitle,GridLineWidth);
      //算行数
      RowCount :=1 +(Height -PixelsTitle)div (PixelsPerRow *FLinesPerRow);
      //每行的高度
      DefaultRowHeight :=PixelsPerRow * FLinesPerRow;
      RowHeights [0 ] :=PixelsTitle;
      for I :=1 to RowCount -1 do
        RowHeights [I ] :=PixelsPerRow * FLinesPerRow;
    end;procedure TMdDbGrid.DrawColumnCell (const Rect:TRect;DataCol:Integer;
    Column:TColumn;State:TGridDrawState);
    var
      Bmp:TBitmap;
      OutRect:TRect;
    begin
      if FLinesPerRow =1 then
        inherited DrawColumnCell(Rect,DataCol,Column,State)
      else
      begin
        Canvas.FillRect (Rect);
        OutRect :=Rect;
        InflateRect (OutRect,-2,-2);
        if Column.Field is TGraphicField then
        begin
          Bmp :=TBitmap.Create;
          try
            Bmp.Assign (Column.Field);
            Canvas.StretchDraw (OutRect,Bmp);
          finally
           Bmp.Free;
          end;
        end
        else if Column.Field is TMemoField then
        begin
          DrawText (Canvas.Handle,PChar (Column.Field.AsString),
            Length (Column.Field.AsString),OutRect,dt_WordBreak or dt_NoPrefix)
        end
        else
          DrawText (Canvas.Handle,PChar (Column.Field.DisplayText),
            Length (Column.Field.DisplayText),OutRect,
            dt_vcenter or dt_SingleLine or dt_NoPrefix);
      end;
    end ;
      

  3.   

    xueyin(雪莹):学GIS有什么好书吧,我也想学,但找不以好书。
      

  4.   

    其实用bmp一样很快,转变一下思路,优化一下数据库读取方式,用不着吊死在一个控件上。
      

  5.   

    我介绍几位gis的高手给你. 就不用书了. taxi(游少爷) 你这样做的方法是把它给画出来, 有较好的办法吗? 我在dbcgrids上放了一个dbimage1控件, dbcgrids定义为4*3,  但是我想最好的办法就是存.jpg格式到数据里头, 
    然后通过dbimage或者其它的dbjpeg(待高手开发)将数据读出谢谢各位关心的朋友
      

  6.   

    来比较一下, .jpg格式文件大小是 8K, .BMP格式是150K老大,快20倍呀! 
      

  7.   

    呵呵,哪你就试试这个吧:
    将adotable的cursorlocation设置为:clUseServer
    将:cachesize设置为10
    比较一下速度.
      

  8.   

    谢谢kingko168(kingko168) 这些我都已经设置过了. 我这cachesize设置为1000了, ado升级, 各方面的工作我都做了, 都无动于忠, 只得改图片格式. 所以我才拿出100大元请高手帮我写个这个的控件. 像DBIMage(dbjpeg)存放.jpg格式的文件 
      

  9.   

    cachesize设置1000不合适.
    我想你是看了李维的书了:)
    10*150K=?
    1000*150K=?
    cursorlocation一定要设置为clUseServer
    不要对表做遍历操作. <切记>
    如果150k/图,速度应在2秒之内.
      

  10.   

    我已经置成你的要求,可是这用有的呀! 非常感谢你, 能不能实现.jpg格式保存
      

  11.   

    我想问一下, adotable1从数据库里头取记录会触发哪些操作
      

  12.   

    如果有时间,就放弃Sql Sever,当数据库达到400M,Sql Sever基本上就吃不消了,速度其慢。
    最好使用Oracle数据库,它可以有效的管理40T的数据。
    我也是做GIS的,你叫个朋友吧!我帮你找找控件,我有一些。你用MO吗?
      

  13.   

    确实如前面人所说的,bmp不是瓶颈,重要的是SQL Sever确实吃不消大数据量,最重要的是数据存取方式上,我曾见过一次演示,450M的卫星照片,从Oracle数据库中读出只花了15秒(局域网),是不是比硬盘还快,但这是真的,最重要的是算法,不是文件的大小。
      

  14.   

    自己users Jpeg.dcu
    然后Timage对jpg什么的都自动支持了!
    对于Gif还要装第三方控件的!
      

  15.   

    哈哈, 我有现成的控件。不过先问一下,你用的是什么DataSet,BDE,ADO还是ClientDataSet?
      

  16.   

    不清楚你具体想实现什么?
    我们以前的做法是这样的:把图片写入IMAGE类型字段中,要用的时候把他先转为JPG文件,然后用IMAGE控件就可以了呀。写入、读出都可以用TBLOBFIELD。
      

  17.   

    chechy(chechy) 您好!大家都大吗?我刚才睡了一会儿, 真是太累了. 受不了了, 谢谢大家的关心. 我用的民ADOTable连接数据库的.
      

  18.   

    我的控件是浏览JPEG图片的,我修改一下,今天发给D6版本的控件给你,你可以安装,如果是D5称早说明。
      

  19.   

    是不是dbjpeg控件,能实现这种功能吗?
      

  20.   

    就是类似DBImage,但是浏览JPEG文件,但是它是只读的。我当初设计这个控件的时候,主要觉得存盘应该比较容易,而浏览麻烦。
      

  21.   

    把图像的存储路径存进数据库,而不是图像的本身存进数据库
    如果一定要这么存的话 字段格式要改成BLOB 字段 然后将数据以二进制流的形式存入