读书人

Delphi缩略图效果!解决思路

发布时间: 2012-03-06 20:47:55 作者: rapoo

Delphi缩略图效果!
我想在左边放一个树形结构显示我的电脑,这个用treeshell就可以实现,
最主要是右边显示所选目录的所有图片的缩略图!
求高手指点!!

[解决办法]
缩略图的最大的关键应该就是在图片的缩放的质量上面了
Delphi的StretchDraw本身是使用的系统的StretchBlt函数来的
这个是速度最快,但是效果最不好的缩放方式了。楼主可用
线性插值等方法来实现缩放,可以参考这个代码,从 猛禽的C++代码修改来的:

Delphi(Pascal) code
procedure StretchBitmap(Dest, Src: TBitmap);var  sw, sh, dw, dh, B, N, x, y, i, j, k, nPixelSize: DWord;  pLinePrev, pLineNext, pDest, pA, pB, pC, pD: PByte;begin  sw := Src.Width -1;  sh := Src.Height -1;  dw := Dest.Width -1;  dh := Dest.Height -1;  //获得显示模式  nPixelSize := Integer(Src.PixelFormat);  if nPixelSize < 4 then    nPixelSize := 4  else if nPixelSize = 4 then    inc(nPixelSize)  else if nPixelSize > 7 then    nPixelSize := 7;  Dest.PixelFormat := TPixelFormat(nPixelSize);  nPixelSize := nPixelSize - 3;  for i := 0 to dh do  begin    pDest := Dest.ScanLine[i];    y := i * sh div dh;    N := dh - i * sh mod dh;    pLinePrev := Src.ScanLine[y];    Inc(y);    if N = dh then      pLineNext := pLinePrev    else      pLineNext := Src.ScanLine[y];    for j := 0 to dw do    begin      x := j * sw div dw * nPixelSize;      B := dw - j * sw mod dw;      pA := pLinePrev;      Inc(pA, x);      pB := pA;      Inc(pB, nPixelSize);      pC := pLineNext;      Inc(pC, x);      pD := pC;      Inc(pD, nPixelSize);      if B = dw then begin        pB := pA;        pD := pC;      end;      for k := 0 to nPixelSize -1 do      begin        pDest^ := Byte(DWord( (B * N * DWord(pA^ - pB^ - pC^ + pD^) + dw * N * pB^                              + dh * B * pC^ + (dw * dh - dh * B - dw * N)* pD^                              + dw * dh div 2) div (dw * dh) ));        Inc(pDest);        Inc(pA);        Inc(pB);        Inc(pC);        Inc(pD);      end;    end;  end;end;
[解决办法]
帮顶了。
[解决办法]
Timage控件本身就可以StretchDraw属性可设,多个Timage控件实现动态加载即可
如果图片很大需大内存机器,否则话极慢
[解决办法]
学习了,收藏~~
[解决办法]
学习
[解决办法]
用ImageEn控件

在窗体上添加 ShellTreeView1,FileListBox1,ImageEnView1 三个组件

FileListBox1的Mask属性为*.jpg

代码如下

Delphi(Pascal) code
unit Unit1;interfaceuses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, ieview, imageenview, StdCtrls, FileCtrl, ComCtrls, ShellCtrls;type  TForm1 = class(TForm)    ShellTreeView1: TShellTreeView;    FileListBox1: TFileListBox;    ImageEnView1: TImageEnView;    procedure ShellTreeView1Change(Sender: TObject; Node: TTreeNode);    procedure FileListBox1Change(Sender: TObject);  private    { Private declarations }  public    { Public declarations }  end;var  Form1: TForm1;implementation{$R *.dfm}procedure TForm1.ShellTreeView1Change(Sender: TObject; Node: TTreeNode);beginform1.FileListBox1.Directory:=form1.ShellTreeView1.Path;end;procedure TForm1.FileListBox1Change(Sender: TObject);varfn:string;beginfn:=filelistbox1.FileName;imageenview1.IO.LoadFromFile(fn);ImageEnView1.Zoom := ImageEnView1.GetIdealZoom;end;end. 

读书人网 >.NET

热点推荐