各位老大,如何用Tiamge快速读取jpeg格式的图片或者缩略图, 小弟这里感谢万分了 在线等待,急, ( 积分: 50 )

  • 主题发起人 主题发起人 skyblue7080
  • 开始时间 开始时间
S

skyblue7080

Unregistered / Unconfirmed
GUEST, unregistred user!
直接用loadfromfile读取500k左右的小图片还没事,1m多的就没办法了,界面都会停止响应,用acdsee7查看速度超快,有没有好的办法可以解决一下,小弟这里感谢万分了
 
直接用loadfromfile读取500k左右的小图片还没事,1m多的就没办法了,界面都会停止响应,用acdsee7查看速度超快,有没有好的办法可以解决一下,小弟这里感谢万分了
 
如果图太多就用多线程处理,如果图太大,可以考虑用文件流打到后再画出来
 
还有就是算法的问题,不同的算法其速度可能会有天壤之别。
 
procedure TGraphic.LoadFromFile(const Filename: string);
var
Stream: TStream;
begin
Stream := TFileStream.Create(Filename, fmOpenRead or fmShareDenyWrite);
try
LoadFromStream(Stream);
finally
Stream.Free;
end;
end;
loadfromfile好像就是从文件流读的,用多线程我也考虑过,不过我的程序在dll里,也就是本身就是一个线程,在里面创建多线程涉及到同步问题不好处理,而且本来图片多的情况不多,所以没考虑多线程,而算法问题我看了那个网上盛行的关于快速读取photoshop 制作的jpeg图片的算法,如果这样确实会快不少,即使文件大也无所谓,但是当我打开一些图片的二进制编码时发现即使1m多的图片,它的编码都是从ffd8 开始到ffd9结束,也就是里面没有内嵌缩略图,所以我觉得这种方法太过时,现在在研究jpeg的图片的二进制编码格式,希望高手能够给点建议,dreamisx兄能否给个算法例子指点一下,
 
用內存流吧
 
多线程的方法,acdsee7好像也只用了一个线程来处理缩略图的显示,如何能达到这种速度的一半,acdsee在速度方面是出了名的,国内好像专门成立了一个开发小组来攻克,希望大家一起来研究一下
 
什么流我都试过了,肯定不是流的问题,关键是要读入1M大小的文件,文件拷贝都要一会,更不用说还是图片处理
 
1M大小读取速度应是一瞬间的事儿(也就是COPY时间的一半),该不是问题
JPEG时间将主要耗在解码上,但好像也不至于到停止响应的程度
我载入一个9M多的JPEG图像,用了十来秒
可ACDSEE全显示也用了六秒多哪
 
只是Timage类没有完全解码前是不会显示的
不像ACDSEE一边解码一边如垂帘状显示,看起来好像速度奇快的样子
还有ACDSEE的缩略图是缓存的,第一次也很慢
 
但是acdsee7在读取图片缩略图的时候,不管图片多大都是一会的功夫就显示完了,我头都晕鸟,现在只要哪一半的速度都满足了
 
等了一天了
 
居然发现同样大小的jpeg和bmp文件再用TImage读取速度上bmp要快的多
 
内存流,解码多少,显示多少,毕竟快了。
结合渲染的方法,就像上色一样先小上色,再强一些的解码方式,看豪杰的大眼睛更明显了。
 
本人分数不多,但因为问题的解决的艰难性,我再加分,希望这个问题能够得到解决,
 
那就别用TIMAGE了,用个IJG之类的库解码
不过IJG是C写的,也不是很好用,但可以精细控制解码过程
快速但低质量的解码及输出的大小
可以用个DLL将解码器包装在DELPHI中使用
 
太麻烦了,算了还是把读取的工作丢到另外一个线程里面让它慢慢处理去吧,以后有好办法希望大家共享,就此散分
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
601
import
I
I
回复
0
查看
780
import
I
后退
顶部