刚编写的图片浏览器,请大家多提意见!(100分)

Ehomsoft很热心啊,图像缩放的失真是在所难免的,大家可以探讨一下acdsee的实现原理,
只需打开一张图,它就一步到位的可以打开相同文件夹下的所有图片,当然打开第一个的是很很慢,特别是图很大的时候,以后就比加快了,估计用的是一个缓存机制
 
在图像放大浏览时速度脚本,我以前是将图像转换为位图,为了确保不失真经过特殊处理的,其实没有必要,并不是缩图浏览,为什么缩的很小还要很清楚呢,Acdsee也没有做到这一点,因此我该为TImage本身的Stretch速度就快多了。但缩图就必须处理了,不然很模糊,像资源浏览器/金山图片浏览器。缩图浏览就单图已比Acdsee慢了许多,下来我在查查。谢谢Ehomsoft的支持。
 
总是要做一些重复劳动好象才伟大......
 
http://www.skin-studio.com
 
不错,不错,恭喜恭喜!
1、我觉得如果你选择了一种浏览方式的话,是不是就应该记住它上一次浏览时的配置信息,
那样就更爽一些。
2、退出时报错;
可以再完善一下,祝你好运!
 
Ehomsoft有没有从图像本身中读取缩略图的算法或源码(我不想研究图像格式),我找了个jpeg的,只支持少部分图像。源码如下:
从JPEG中提取缩图
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;  
 
Ehomsoft我看了你的亿合图像秀,的确不错,功能比我的强大多了,惭愧,我觉得缩图有些模糊,显示jpeg缩图时个别图像一样,可能是由于个别无法从jpeg中提取缩图造成的,共同努力,我不想在看图程序上下太大功夫了。
 
总体来说还行,改改错误,不断努力
 
并不是说做重复劳动才伟大,毕竟也可以练练手;
只想不做,是不会提高得
 
不怕大家笑话,之前我也曾试用VFP仿ACDSEE做过一个看图程序,也在缩略图区,但只是简单的用了IMAGE控件的等比缩小功能,运行起来后进入一个多图片的文件夹后资源占用十分严重,256内存只剩下几兆~~~~~
实用价值太差,没干下去了,哈哈
 
"有没有从图像本身中读取缩略图的算法或源码(我不想研究图像格式)"

不可能有,不是所有图像格式都定义缩略图的

但每种图像都有减少处理数据量的办法,如上面说的读取JPEG格式本身含有缩略图,读取PCD五张图中最小那张(192 X 128),还有EPS格式,不解析PostScript,而读取其中含有的WMF,TIFF图像~~~还大量按行存储的图像,可以用隔行取样的办法获得数据进行处理,因为上面产生缩略图的方法本就是临近取样!当然提高图像解析速度也是种根本解决办法,还有像解析JPEG这类图像格式可以利用CPU扩展指令集优化矩阵运算!

当然前提当然是了解图像格式!

我上面也说了,你放缩慢就是因为对位图本身进行了放缩(因为会报ScanLine错误,没猜错吧?),而效果上看,用的就是临近取样插值,实际上效果和用StretchBlt绘图没区别,而速度这么慢要贴出代码才能看出问题!如果要效果可换用双线性插值,如果程序写的好,速度上还能接受,当然如果图太大要兼顾速度就必须分区域处理!
 
去看看了。
 
缩略图部分闪烁太利害了
而且如果当前目录下的图很多,用户拖动滚动条到下面的时候,应该先显示下面的缩略图出来

光辉图片浏览器 的缩略图质量比 亿合图像秀 的要好: ACDSee的新版本的缩略图质量已经是比较好的了
 
亿合图像秀 的动态 gif 显示有问题
 
俺写了一个放大缩小的组件,谁有兴趣看看效果,俺发!
 
pengyt:
CSDN上下的?那是以前的版本,在这下:
http://www.ehomsoft.com/download/PicShow.zip

你说的问题都已经解决
 
ydy:

发给我看看吧:
zhouwei@ehom.net

是二次,三次,还是四次插值?把插值公式写一下吧!

你的效果好在哪呢?做了什么特殊处理?
 
亿合图像秀 的缩略图质量还是不行, 你可以看一个有文字的图,缩小后文字完全看不清楚了
 
因为现在性能已经很差了,不过放心这种产生缩略图的方法早晚要改

生成过N个目录的缩略图后对比下速度,占用内存量,句柄数,GDI对象数等差别,目前这点缩略图质量下降还是有必要的,对产生缩略图来说,牺牲性能换取效果,不值得!当然有治本的方法,上面说的减少数据量就可以(BMP,RAS这类都好实现,主要是生成JPEG的缩略图难,不过ACDSee处理JPEG快,是因为它用了Intel JPEG library,见C:/Program Files/Common Files/ACD Systems/PlugIns/ijl11.dll),以后有空慢慢实现吧!现在和朋友一起做个图像处理软件,计划的比较大!所以这个软件一年来基本上是小改(这个软件两年前开始写的,很长吧^_^),增加了一些小功能和增加了几种文件格式的读写支持,如果这个软件和上面说和朋友合作的图像处理软件如果捆绑到国外销售,细节问题一定会处理好的

如果要产生高质量的图像放缩效果,可在"亿合图像处理附件"的改变图像大小功能中选择合适的插值算法

另外向楼主报告:)

在没有大图的情况下,ImgView的峰值内存占用量也可以上百M,线程开了十几个,浏览过一段时间后,GDI对象高达一两千个,是不是没释放资源?太耗资源了吧~~~汗...
 
Ehomsoft
俺已经发了,看看!
 

Similar threads

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