关于Acdsee显示缩略图时的缓冲模式! (100分)

  • 主题发起人 主题发起人 一少
  • 开始时间 开始时间

一少

Unregistered / Unconfirmed
GUEST, unregistred user!
打开有好几百张图片的目录, 缩略图要全部显示出来需要不少时间, 但用Acdsee却感觉不到很慢, 不管你把滚动条拖到哪儿, 那里的图片都优先被显示出来, 其他的继续在后台执行,这是什么技术?
 
它是用的是多线程来处理的!
 
不用缓冲啊,你看我的 focussee 就是这样的: 不管你把滚动条拖到哪儿, 那里的图片都优先被显示出来,

http://www.focussee.com
 
to pengyt
你的软件做得不错! 能否问一下你用了哪些技术,仅仅是多线程?
 
实现那个技术应该不是特别难,甚至不需要用到多线程技术的。你研究一下acdsee2.43就会发现,它没有用多线程技术。
我也一直在研究acdsee,我做了一个类似软件,见:www.enova-soft.com
我们可以互相探讨。
QQ:8022820
加好友打"acdsee研究"
 
哇,都是高手,学习中。。。。。。。。
 
只用了多线程,实际上仅仅就是多了一个线程
 
to pengyt:
你的软件做得很不错,希望能相互切磋。。
 
太客气了
 
to pengyt: 只用了一个线程? 那为何拖到哪里哪里的就优先显示呢? 能否解释一下是什么原因,我很想知道
 
利用onscroll事件。
 
主线程监控拖到哪里,发生变化就通知生成Thumb的线程,优先生成显示窗口内的Thumb,就是两个线程
 
to pengyt:
请告诉我你的QQ,我们在线聊一聊好吗?
我的qq:8022820,email:shang_yan@0733.com
 
我基本不用QQ,你可以用MSN加我,已经给你邮件了
 
这个资料你看看吧
用Delphi读取JPEG文件的缩览图
--------------------------------------------------------------------------------
  JPEG图像文件以高压缩比和高图像质量著称,市面上的图库光盘中的图像文件大都是JPEG格式的。怎样从一大堆JPEG文件中查找合适的图像呢?使用JPEG文件的缩览图就是其中方法之一。
  在PhotoShop 4.0(或以上版本)的打开文件对话框中,当打开JPEG文件时,PhotoShop很快把它的缩览图显示出来。为什么PhotoShop能这么快地显示出JPEG文件的缩览图呢?
  原来PhotoShop在保存JPEG文件时把它的缩览图也保存在文件里。PhotoShop定义了新的段FF ED,这个段保存了一个JPEG文件格式的缩览图,大图中有小图。FF ED段后两个字节是这个段的长度,在这个段里有缩览图的开始标志FF D8和结束标志FF D9,将这个段拷贝出来即可获得该图的缩览图。值得注意的是PhotoShop 4.0解出的缩览图,像素格式不是常规的RGB,而是BGR格式,所以还得加入BGR转为RGB的代码,转化过程是在内存里把B和R的位置交换。
  下面是Delphi编写的快速读取PhotoShop 4.0(或以上版本)JPEG文件的缩览图的程序,程序用TFileStream读取JPEG文件的FF ED段,结合TmemoryStream、TJPEGimage, 返回BMP格式的缩览图。
  function LoadThumb(filename:shortstring):TBitmap;
  procedure BGR2RGB(var bmp:TBitmap);
  var
  x,y:integer; t:char; data:pchar;
  begin
  for y:=bmp.Height-1 downto 0 do
  begin
  data:=bmp.ScanLine[y];
  for x:=0 to bmp.Width-1 do
  begin
  t:=data[x*3];
  data[x*3]:=data[x*3+2];
  data[x*3+2]:=t;
  end;
  end;
  end;
  var
  fstream:Tfilestream; mstream:Tmemorystream;
  j,i:word;data:pchar; buf:array [0..3] of byte;
  filesize:DWORD; fjpg:Tjpegimage;bmp:Tbitmap;
  begin
  result:=nil;
  fstream:=Tfilestream.create(filename,fmOpenRead);
  //建立文件流,读JPEG文件
  fstream.Seek(20,soFromBeginning); //FF ED段在文件的第20个字节处
  fstream.Read(buf,sizeof(buf));
  if PWORD(@buf[0])^=$EDFF then
  begin
  j:=buf[2]*256+buf[3]; //FF ED的大小,高位在前,低位在后
  if j<1024 then //FF ED段的大小若为1024个字节则文件不包含缩览图,退出程序
  begin
  fstream.free;
  exit;
  end;
  mstream:=TMemorystream.Create;//建立内存流
  mstream.CopyFrom(fstream,j); //把FF ED段拷贝到mstream
  data:=mstream.Memory;
  for i:=300 to 700 do //找缩览图的开始标志FF D8
  if PWORD(@data)^=$D8FF then break;
  if i<700 then
  begin
  fjpg:=Tjpegimage.Create; //建立TJPEGimage 解出缩览图
  bmp:=TBitmap.Create;
  mstream.Position:=i;
  fjpg.LoadFromStream(mstream);//fjpg读取mstream
  bmp.Assign(fjpg); //JPEG转BMP
  if PWORD(@data[i+57])^=$2e34 then //PhotoShop 4.0的缩览图
  BGR2RGB(bmp); //BMP的像素格式BGR 而不是RGB,要把BGR转化为RGB
  result:=bmp; //函数返回BMP
  mstream.Free;
  fjpg.Free; //释放Object
  end;end;
  fstream.free;
  end;
  可直接把Delphi 的Timage可视控件拖到Form上,用image.picture.bitmap:= LoadThumb(filename) 即可显示PhotoShop JPEG文件的缩览图。
 
我不是读取jpeg文件内含的缩略图的:
因为:
1:有些JPEG没有内含的缩略图,
2:内含的缩略图的图象质量不够好
3:内含的缩略图的大小不一定合适

我是读取全图后在用算法平滑自己生成缩略图的,你可以看一些包含文字的图,缩小后也基本能看出一个大概.总之,读取JPEG的缩略图是一件吃力不讨好的事情,而且不通用
 
同意楼上的。只能靠代码生成文件的缩略图。生成缩略图的方法很简单,用canvas.stretchdraw就行了
 
JPEG是按行编码/存储的,所以可以跳行读取/解码,大大加快缩略图的产生.
 
很好的提示
 
接受答案了.
 

Similar threads

D
回复
0
查看
766
DelphiTeacher的专栏
D
D
回复
0
查看
738
DelphiTeacher的专栏
D
D
回复
0
查看
691
DelphiTeacher的专栏
D
D
回复
0
查看
775
DelphiTeacher的专栏
D
D
回复
0
查看
680
DelphiTeacher的专栏
D
后退
顶部