我想实现对某个目录下面的图像文件(jpg)的预览,就像ACDSee 那样将所有图片都以小的图片方式预览放在一个容器里面,请问高手们,应如何实现?
解决方案 »
- 用户权限管理,使用actionlist和applicationevents来实现?
- 一个关于进入注册表读出windows版本的很简单的问题
- vista下如何编程隐藏文件,在2000下可以hook,findnextfile,vista下怎么不可以.
- 请教从VB转DELPHI的同志
- 用javascript调用delphi编写的ActiveX控件,能不能传出多个参数?
- 紧张,希望大家祝福我一下
- 关于Dock的问题
- 高分求ado连接oracle查询的代码
- 请进来看看,你决不后悔的!!
- 在线等待:请问如何得到CheckListBox中Item重名的记录 ? 详情请看帖内容。
- 急,200分求delphi的OpenGL的资料……
- 请教MediaPlayer的使用
首先谢谢你
我是说实现像 ACDsee 那样预览某个目录下面的所有图像文件,如果直接使用image来显示原始文件,如果文件太多(n十,n百....个)这样系统资源占用会太大,不合理,我想 ACDsee 肯定是在预览前对图像进行了某种处理,从而减少系统资源的占用,不知我说的你明白了吗?
有问题请发信息到我的E-mail:[email protected]
对不起,我看了虽然有点眉目,但还是不知如何所加到listview 或scrollbox 中,请大哥再帮小弟一把呀 OriginalBmp 是什么呀
我理解能力差呀:(
[email protected]
[email protected]
用TPicture去读图形文件,
用TPicture.Graphic去判断此图形的大小等你要的属性,
用TBitmap去按你的要求重新绘制,
当然,一定要用多线程。看看我的程序,就有这种Thumb
www.netgocn.com
用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[i])^=$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文件的缩览图。
to lixif() :我的方法也吸取的你的思路,谢谢你
glassesboy(glassesboy) :特别感谢你对我的帮助好了,在此谢谢你们,现在结贴发薪:)