|
盒子资源分类 |
|
|
|
|
超快缩图预览控件 TfastpicPreview |
|
关键字:缩图,预览,控件,delphi 7, 资料库连结 |
来 自:转载,http://delphi.ktop.com.tw/board.php?cid=30&fid=74&tid=99299 |
平 台:Win2k/XP/NT,Win2003,Vista |
下载所需:0 火柴 |
深浅度:中级 |
完成时间:2009/9/24 |
发布者:hikor |
发布时间:2009/9/25 |
编辑器:DELPHI7 |
语 种:简体中文 |
分 类:图形 |
下载浏览:2157/19165 |
|
|
|
|
图海浮沉录
最近需要一个展示图片的元件,网上乱google了一下,发现都不是很满意,后来试了下jedi中的 jvThumbView 等二个元件,在效能及操控上都不令人满意,所以决定自己来造轮子。 问题是自己对图形方面不是很了解(哈,其实是各方面都不很了解),所以就在ktop 这搜了一下,算是颇有收获,其中像是 redsnow 版大在某帖上所说的,很有启发性。 依着该思路实作,一方面加入 graphicEx 组件,以增加可处理的图片格式,一方面针对 jpg 用TJPEGImage作优化处理。 另外在显示方面则利用listview + imageList.
感觉就要大功告成时,却发现listview 变成了 flash view, 闪动的很厉害。可是在站上看到有人介绍一个用 vc 实作的 Thumbnails Viewer using ListCtrl 一点都不会闪动,图片很cool的一张一张翻开更新。检视一下他用的物件也是windows 的 ListCtrl + imagelist,实作代码叫用的api与自己的是一样的。奇了?那有用vc表现极佳的代码,用delphi 就变成垃圾?抱着一个不信邪的精神,终于谜底揭晓,原来不是因为delphi不好,而是因为delphi太好了。 这话怎么说? 因为vcl 封装的很好,所以每次 ImageList 新增或取代一个image时,就通知使用它的元件,例如 listview。每次listview 收到通知(ImageListChange),就叫 SetImageList ,然后 ListView_SetImageList 然后windows 系统就重绘整个 listview.这是好事,省却我们去处理这些相关的变动。 但是当同时大量新增image时,大量的整个listview重绘,就会导致画面闪动。
处理方法 : 继承 ImageList ,覆载 change. 加入一行 if FDoNoChange then exit; 如此在大量新增时,将 FDoNoChange设为true即可。
看着程式以高速而优雅的姿态展示着图片,就如同过去delphi起始界面上高雅的智慧女神像,内心不仅升起一股感动。正沉浸于这美好的时光,一个所有程式作者熟到不能再熟的画面出现了 !!! "错误讯息"! 什么?怎么可能,这一定是图档本身的问题,自己如是的安慰自己。经过一翻确认发现果然 TJPEGImage 就无法显示该图片,嘿嘿连 graphicEx 也报错,有了这两个权威元件的判决书,于是又重拾回美好的心情,可以打包收工了。
.....咦! 该死的 ms档案总管,豪不留情而大剌剌的将该缩图刺进了我的眼睛,显然ms就是有办法处理,这又将我重打入网海乱估(咕? google)的轮回。
gdi plus ? 一眼瞧见了它。加了个plus,还是ms的东西。试试吧。一经测试,马上惊为天人,不但该问题.jpg不再是问题, 连另一个问题 .tift档( graphicEx会报错 )也悠然显现。不仅如此,其处理速度也很快。实测了一下,以jpeg格式来说,graphicEx元件由于不作任何优化处理所以会慢上数倍(当然如果深入其核心,也许可以做优化设定,毕竟source code 都是现成的),TJPEGImage元件如果依redshow前辈的口诀设定,速度很快,而gdi plus 不做任何设定时,速度已经就和TJPEGImage 一样快,哇,那设定一下还得了?找了一下,发现无处可设。大概ms认为你想得到优化手法,它都想得到而且 "加"进去了,这 gdi plus 当中 "plus" 的头衔果然不是浪得虚名。
经过了这样一番周折,至此算是大事底定,小功告成了。下面作个总结。
总结:在 delphi下,免费的图形资源中,以 gdi plus + graphicEx 算是完美组合了。一般常见的图形格式如jpg,tif,png,bmp,就用gdi plus 快速处理,其他的格式就交给 graphicEx处理。如此也就不需要各别的TJPEGImage 等元件了。 缺点: 这两组在处理上叫用的方法不同,需要加以封装才会好用。
图形显示部份用大家都已熟悉的 listview + imageList。
图形应用部份应该要能轻易与 shell treeview 及 资料库 dataset 等元件结合,因为这是最常见的图形储存模式。
最后实作出的元件 TfastPicPreview, 有兴趣的朋友可下载试看看。 |
|
本站原创作品,未经作者许可,严禁任何方式转载;转载作品,如果侵犯了您的权益,请联系我们! |
相关文章 |
|
|
|
相关评论 |
|
共有评论13条
当前显示最后6条评论
|
youcheng |
2009/9/26 11:38:36 |
用的是哪个GDIPLUS包?能否提供一下? |
up08 |
2009/9/26 15:22:40 |
来自台湾的朋友的多多支持 |
smt44 |
2009/10/21 22:56:59 |
支持分享 |
the_o |
2010/3/22 0:48:11 |
感谢作者提供这么好的文章。可了后很有感触! |
seanyzhou |
2010/4/23 23:48:47 |
ai, 这个包打的, 不就能把用到的gdi plus和graphicEx一块打包进去吗, 用都用不了 |
q1q1q1 |
2011/8/12 10:17:25 |
hikor:看了你写的FastPicPreview很受启发,但是我用DBISAM数据库显示JPG的图像时就显不了了(用了两种图像格式:BLOB和Graphic),不知道是什么原因,我看了你的说明你加了gdi plus好像又支持JPG,但是为什么我有测试时都出问题呢?出现两个问题一个是不显图像,另一个是出现提示窗:do something here... 显示EDatabaseError with message 'Missing table name' 这个是能是我用DBISAM数据的兼容问题。希望你能帮我解决这问题。 |
我要发表评论 |
查看全部评论 |
|
|
|