怎么用程序来实现图象缩略图的显示?(50分)

  • 主题发起人 主题发起人 草在墙头
  • 开始时间 开始时间

草在墙头

Unregistered / Unconfirmed
GUEST, unregistred user!
快速读取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文件的缩览图。

以上摘自《超级猛料2003》
 
to 非典型肺炎患者:
是不是应该所有JPEG image都有缩略图??
我刚才试了一下你的代码,只有几个能显示出来,而大部分的都不行?
why?
 
很多类型文件的显示,还必须自己写。
 
to myanwei:
能举个例子吗?小弟实在太菜!
 
我也象知道
 
jpeg 中的缩略图的质量非常差,还是自己来做缩略图吧
 
后退
顶部