用Listview实现缩略图为什么总有问题(附程序源码)

heikeyanxi 2009-04-30 04:02:18
不知道为什么用listview显示缩略图总有问题,请大家帮忙看下下载地址里的工程源码,告诉我到底哪里出问题了,谢谢了
下载地址:
http://cnc.fs1.bay.cech.com.cn/download/23232781/adbrave/633767034992187500/55764ab7cca3ead81c8a55485739ba67/%E5%9B%BE%E7%89%87%E7%BC%A9%E7%95%A5%E5%9B%BE%E6%B5%8F%E8%A7%88.rar
...全文
101 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
heikeyanxi 2009-04-30
  • 打赏
  • 举报
回复
高手啊 ,我就是想要这种效果,非常感谢!!

马上结贴给分!
taxi 2009-04-30
  • 打赏
  • 举报
回复
为了让缩略图在中间显示,改用下面的代码:
procedure ScaleToBitmap(ASrc, ADest: TBitmap);
var
w, h, newW, newH, row, col, offsetW, offsetH: Integer;
sw, sh, scale: Single;
src, dest: PRGBTriple;
begin
w := ASrc.Width;
h := ASrc.Height;
sw := w / 80;
sh := h / 80;
scale := Max(sw, sh);
newW := Trunc(ASrc.Width / scale);
newH := Trunc(ASrc.Height / scale);
offsetW := (ADest.Width - newW) div 2;
offsetH := (ADest.Height - newH) div 2;
for row := 0 to newH - 1 do
begin
src := ASrc.ScanLine[Trunc(row * scale)];
dest := PRGBTriple(Integer(ADest.ScanLine[offsetH + row]) + offsetW * SizeOf(TRGBTriple));
for col := 0 to newW - 1 do
begin
dest^ := PRGBTriple(Integer(src) + SizeOf(TRGBTriple) * Trunc(col * scale))^;
Inc(dest);
end;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
TheBitmap, DestBitmap:TBitmap ;
TheJpeg:TJPEGImage;
aa:tlistitem;
i:integer;
begin
ImageList1.Clear;
for i:=1 to 5 do
begin
TheJpeg := TJPEGImage.Create;
TheJpeg.LoadFromFile('.\Images\'+inttostr(i)+'.jpg');
TheBitmap := TBitmap.Create ;
TheBitmap.Assign(TheJpeg);
TheBitmap.PixelFormat := pf24Bit;
DestBitmap := TBitmap.Create;
DestBitmap.Width := 80;
DestBitmap.Height := 80;
DestBitmap.PixelFormat := pf24Bit;
ScaleToBitmap(TheBitmap, DestBitmap);
ImageList1.Width:=80;
ImageList1.Height:=80;
ImageList1.Add(DestBitmap, nil) ;
aa:=listview1.Items.Add;
aa.Caption:=inttostr(i)+'.jpg';
aa.ImageIndex :=ImageList1.Count -1;
FreeAndNil(DestBitmap);
FreeAndNil(TheBitmap) ;
FreeAndNil(TheJpeg);
end;

end;
taxi 2009-04-30
  • 打赏
  • 举报
回复
这样就行了:
procedure ScaleToBitmap(ASrc, ADest: TBitmap);
var
w, h, row, col: Integer;
sw, sh, scale: Single;
src, dest: PRGBTriple;
begin
w := ASrc.Width;
h := ASrc.Height;
sw := w / 80;
sh := h / 80;
scale := Max(sw, sh);
ADest.Width := Trunc(ASrc.Width / scale);
ADest.Height := Trunc(ASrc.Height / scale);
for row := 0 to ADest.Height - 1 do
begin
src := ASrc.ScanLine[Trunc(row * scale)];
dest := ADest.ScanLine[row];
for col := 0 to ADest.Width - 1 do
begin
dest^ := PRGBTriple(Integer(src) + SizeOf(TRGBTriple) * Trunc(col * scale))^;
Inc(dest);
end;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
TheBitmap, DestBitmap:TBitmap ;
TheJpeg:TJPEGImage;
aa:tlistitem;
i:integer;
begin
ImageList1.Clear;
for i:=1 to 4 do
begin
TheJpeg := TJPEGImage.Create;
TheJpeg.LoadFromFile('.\Images\'+inttostr(i)+'.jpg');
TheBitmap := TBitmap.Create ;
TheBitmap.Assign(TheJpeg);
TheBitmap.PixelFormat := pf24Bit;
DestBitmap := TBitmap.Create;
DestBitmap.PixelFormat := pf24Bit;
ScaleToBitmap(TheBitmap, DestBitmap);
DestBitmap.Width := 80;
DestBitmap.Height := 80;
ImageList1.Width:=80;
ImageList1.Height:=80;
ImageList1.Add(DestBitmap, nil) ;
aa:=listview1.Items.Add;
aa.Caption:=inttostr(i)+'.jpg';
aa.ImageIndex :=ImageList1.Count -1;
FreeAndNil(DestBitmap);
FreeAndNil(TheBitmap) ;
FreeAndNil(TheJpeg);
end;

end;
taxi 2009-04-30
  • 打赏
  • 举报
回复
哦,统一缩略到某个固定大小?
heikeyanxi 2009-04-30
  • 打赏
  • 举报
回复
晕,这样显示的不是缩略图,图片根本没有缩小到80*80,如果要缩小到指定数值要怎么改呢?
我就是用你上面的代码试的
taxi 2009-04-30
  • 打赏
  • 举报
回复
试了,这样就行了,不知你有什么问题。
procedure TForm1.Button2Click(Sender: TObject);
var
TheBitmap:TBitmap ;
TheJpeg:TJPEGImage;
aa:tlistitem;
i:integer;
begin
ImageList1.Clear;
for i:=1 to 4 do
begin
TheJpeg := TJPEGImage.Create;
TheJpeg.LoadFromFile('.\Images\'+inttostr(i)+'.jpg');
TheBitmap := TBitmap.Create ;
TheBitmap.Assign(TheJpeg);
ImageList1.Width:=80;
ImageList1.Height:=80;
ImageList1.Add(TheBitmap, nil) ;
aa:=listview1.Items.Add;
aa.Caption:=inttostr(i)+'.jpg';
aa.ImageIndex :=ImageList1.Count -1;
FreeAndNil(TheBitmap) ;
FreeAndNil(TheJpeg);
end;

end;
taxi 2009-04-30
  • 打赏
  • 举报
回复
你的问题是什么,我用bmp试了下,是可以的。
另外,你的jpeg文件找不到,没有包括到压缩包中。
heikeyanxi 2009-04-30
  • 打赏
  • 举报
回复
哦,抱歉,那用下面这个链接吧..

http://www.pckno.com/test/图片缩略图浏览.rar
taxi 2009-04-30
  • 打赏
  • 举报
回复
要登陆呢。

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧