大图片的处理?(100分)

  • 主题发起人 主题发起人 hds6400
  • 开始时间 开始时间
H

hds6400

Unregistered / Unconfirmed
GUEST, unregistred user!
我现在有一系列图片,格式为jpg,其中每张大约为2M左右,我的需求是首先要在一个界面上显示这些图片的缩略图,鼠标双击本图片后显示完整的图片信息。但是当我动态创建图片的时候(由于图片张数和内容不定,所以必须动态创建)发现图片显示的速度特别慢,请问各位大侠有何方法解决?
 
你要显示两M的图片怎么样也快不到哪去了?
 
to app2001:
我开始显示的图片其实只要一个缩略图就可以了,是否有控件能实现此功能?
 
对于jpg文件,怎么着你也得先解压。
 
看看Acdsee快吗
 
来源:论坛转载无法确定出处,如有版权问题请与我们联系

用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,将这个段拷贝出来即可获得该图的缩览图(见图1)。值得注意的是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;


  图1

  可直接把Delphi 的Timage可视控件拖到Form上,用image.picture.bitmap:= LoadThumb(filename) 即可显示PhotoShop JPEG文件的缩览图。
 
数据库再放一个字段存缩略图
点击缩略图后显示正常图片
 
to app2001:
我的jpg文件不是通过PhotoShop转化的,并且在windows通过缩略图显示时也非常慢
 
你再看看这个资料,试试这个方法看看??
图片的缩放
procedure TForm1.Button1Click(Sender: TObject);
var
b: TBitmap;//原图片
nb: TBitmap;//Resize以后的图片
r: TRect;
begin
b := TBitmap.Create;

if OpenDialog1.Execute then
begin
b.LoadFromFile(OpenDialog1.FileName);
nb := TBitmap.Create;

//你可以自己定义高度和宽度,这里是都变成一半
nb.Height := b.Height div 2; //高度变为原来的一半
nb.Width := b.Width div 2; //宽度变为原来的一半
r.TopLeft := Point(0, 0);
r.BottomRight := Point(nb.Width, nb.Height);

with nb.Canvas do
begin
Pen.Style := psDash;
Brush.Style := bsClear;
Rectangle(0, 0, nb.Width, nb.Height);
StretchDraw(r, TGraphic(b));
end;
if SaveDialog1.Execute then nb.SaveToFile(SaveDialog1.FileName);
nb.Free;
end;
b.Free;
end;
 
to app2001:
速度还是很慢
 
那你就用PHOSHOW处理一下吧,在PHOSHOW里录一个动作来处理一下也很快的。
 
to app2001:
我的图片是从实时的从网络上传送过来的,不可能用PhotoShop进行转化。
 
神仙也没办法!

看Windows的预览方式,处理陌生图像文件时,速度也好不到那去。
一但预览过,它应该保存了以前生成的缩略图,速度出就上去了。
其实可以按它的思路处理。
1.保存自己生成的缩略图;
2.后台处理缩略图;
3.当前查看范围内的图优先处理;
4.已生成缩略图的图片,直接显示;
5.网络上传送过来的过程中实时解压,传完了,缩略图基本上也就生成了.
6.判断图片中是否存在缩略图,存在,就直接用.
 
多人接受答案了。
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部