各位兄弟,请教了。我现在做一个数据库管理系统,难点在每个记录都对应一个到多个图片,要数据和图片一块显示出来。(图片太多,存储于数据库中会很大,很慢)
我现在的设计方案是这样:
1.服务器端数据存储到数据库,图片以编码为名称存储在一个文件夹下,对此文件夹提供ftp下载服务
2.客户端按查询得的编码,下载图片到客户端。
3.对下载到的图片产生缩略图。
4.将缩略图与数据写入客户端的一个临时数据库中。
5.界面上的数据就采用DBCtrlGrid1将(数据+图片)成块显示出来。
以上是小弟的初步方案,我现在担心的是一旦一次要下载图片的图片很多时,会不会很慢?第四步是否
必要要将数据+图片同时写入数据库,因为这一步会相对耗时很多?是否有更好的办法
小弟不知各位还是否有更好的方案,能否告知?我的方案也请各位指出不足,谢谢各位了
我现在的设计方案是这样:
1.服务器端数据存储到数据库,图片以编码为名称存储在一个文件夹下,对此文件夹提供ftp下载服务
2.客户端按查询得的编码,下载图片到客户端。
3.对下载到的图片产生缩略图。
4.将缩略图与数据写入客户端的一个临时数据库中。
5.界面上的数据就采用DBCtrlGrid1将(数据+图片)成块显示出来。
以上是小弟的初步方案,我现在担心的是一旦一次要下载图片的图片很多时,会不会很慢?第四步是否
必要要将数据+图片同时写入数据库,因为这一步会相对耗时很多?是否有更好的办法
小弟不知各位还是否有更好的方案,能否告知?我的方案也请各位指出不足,谢谢各位了
如果全放到数据库中,速度就是最大的频径,数据可能2--5万比,恐怕query.open都得等上好久
转换为流 :TFileStream TMemoryStream 处理
即使放到数据库单独放一个表种,界面显示的时候,先显示数据记录,图片显示部分先loading... 然后显示图片,大家就能接收,谁都知道图片慢,但记录不能慢
存的时候同样
1、图片大的问题。通常我会这么解决图片太大的问题,我会保存为 Jpg,并根据我的要求调整压缩比。
2、数据结构:
TableMain 你的主记录表,pID 为主键,TablePic 同样以 pID 为主键,一对一的关系。
3、显示问题:
在批量浏览的时候只显示主表记录,如果想查看图片,可单独做按钮,或双击一条记录显示详细内容,这个时候再从数据库中把对应的图片取出来显示,由于是单条就会很快。
4、效率问题:
如果想大量的显示,比如一屏显示 N 条记录,则要费一点工夫了,会大加程序量:
1、采用本地缓存技术,即每看一张图片就把它给保存到本地的目录中,并且打上最后更新的时间,否则你没办法判断,本地的图片新,还是服务器的图片新。
2、分屏显示,因为屏幕的大小是有限的,你不可能一下子显示很多图片,太多也没法看,
最多也就是二三十条,那这个时候如果用 C/S 程序一部分从本地取,一部分从远程取,就
会很快,我所说的一部分是本地有的就在本地,本地没有的就去服务器取。
5、保存在数据库(SQL Server)中后,数据库急骤膨胀的问题:
可以把图片这张表建在另一个数据库中例如在 SQL Server 中,DBMain 这是主数据库,
DBPic 是照片数据库,把 TablePic 建在 DBPic 中,把 TableMain 建在 DBMain 中。缺点:
我们用的是 SQL Server 的数据库,存入大量的图片以后,数据库的尺寸会急骤膨胀,而且删除、插入操作越频繁数据库日志文件的尺寸膨胀就越利害。说的比较多,不知道对楼主有没有用,咱们相互交流。
procedure TForm1.Button2Click(Sender: TObject);
var
B:TBitmap;
J:TJPEGImage; //<<<用此类,你要 uses JPEG 单元。
begin
B:=TBitmap.Create;
try
B.LoadFromFile('c:\Desktop.bmp');
J:=TJPEGImage.Create;
try
J.Assign(B);
J.SaveToFile('c:\Desktop.Jpg');
// Desktop.bmp 为我从我当前 Delphi 的编辑环境抓屏的图为 1024 * 768 的 24bit(真彩图)
// 3MB多的图,未经任何处理,
// 转换后变成了 166KB 当然视图片的内容而言,内容不同压缩比不同。
// 别忘了 JPG 图片是失真的。
//-------------------------------------------------------
//再试试 50% 压缩;
J.CompressionQuality:=50; //<<<压缩比
J.Compress(); //<<<压缩函数
J.SaveToFile('c:\CompressionQuality.Jpg');
//效果比较差,尺寸又小了许多,变成了 90KB 。
finally
J.Free;
end;
finally
B.Free;
end;
end;
我最近也做了个类似的程序,用来扫描并保存质保书的,以前也是保存在数据库中,但保存的时候极慢。现在改为上传到服务器,以文件形式存放,数据库只保留路径。客户端查询时FTP形式下载,目前用户反映良好。
你可以到 www.ntw.com 上了解一下他们怎么做的。