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.