gpt4 book ai didi

image - 在 tlistbox 中绘制缩略图

转载 作者:行者123 更新时间:2023-12-02 08:13:13 26 4
gpt4 key购买 nike

在 DelphiXE 中,我使用 tFileOpenDialog 选择一个文件夹,然后在 tListBox 中列出该文件夹中的所有 *.jpg 文件。我允许将列表项拖放到列表中进行自定义排序,以便稍后按顺序显示它们。

我希望能够在文件名旁边绘制图像的缩略图,以便在 ListView 中查看文件时显示类似于 Windows 资源管理器,在 ListView 中文件名左侧有关联的图标同一行。

我发现了几个旧示例,这些示例使我相信使用 tListBox.onDrawItem 可以实现这一点,但我一直无法让其工作。

使用 tListBox 或其他方式实现此目标的最佳方法是什么?

感谢您的帮助。

<小时/>

更新:按照建议,我一直在努力使用 tListView。

我尝试将 Ken 和 Andreas 的示例转换为使用实际图像,而不是动态创建的示例位图。我能够使基本功能正常工作,但如果不调整大小,我只能得到图像 64*64 的左上角。目前我只处理 JPG。 imagecount 只是列表框中文件名列表的计数,此时我还没有将初始列表创建移动到 ListView 中。

这是用这段代码完成的:

procedure TfrmMain.CreateThumbnails;
var
i: Integer;
FJpeg: TJpegImage;
R: TRect;
begin
for i := 0 to imageCount - 1 do
begin
FJpeg := TJpegImage.Create;
thumbs[i] := TBitmap.Create;
FJpeg.LoadFromFile(Concat(imgFolderlabel.caption,
photoList.Items.Strings[i]));
thumbs[i].Assign(FJpeg);
thumbs[i].SetSize(64, 64);
end;
imgListView.LargeImages := ImageList1;
FJpeg.Free;
end;

为了在缩略图内正确调整图像大小和拉伸(stretch)图像,我尝试从这里实现一些代码:http://delphi.about.com/od/graphics/a/resize_image.htm

新代码如下所示:


procedure TfrmMain.CreateThumbnails;
var
i: Integer;
FJpeg: TJpegImage;
R: TRect;
begin
for i := 0 to imageCount - 1 do
begin
FJpeg := TJpegImage.Create;
thumbs[i] := TBitmap.Create;
FJpeg.LoadFromFile(Concat(imgFolderlabel.caption,
photoList.Items.Strings[i]));
thumbs[i].Assign(FJpeg);<br/>
//resize code
R.Left := 0;
R.Top := 0;
// proportional resize
if thumbs[i].Width > thumbs[i].Height then
begin
R.Right := 64;
R.Bottom := (64 * thumbs[i].Height) div thumbs[i].Width;
end
else
begin
R.Bottom := 64;
R.Right := (64 * thumbs[i].Width) div thumbs[i].Height;
end;
thumbs[i].Canvas.StretchDraw(R, thumbs[i]);
// resize image
//thumbs[i].Width := R.Right;
//thumbs[i].Height := R.Bottom;<br/>
thumbs[i].SetSize(64, 64); //all images must be same size for listview<br/>
end;
imgListView.LargeImages := ImageList1;
FJpeg.Free;
end;

这为我提供了图像缩略图及其文件名的拼贴画,效果很好。

谢谢。

最佳答案

不是答案,而是替代方案(使用 Andreas 的代码创建图像数组作为起点)。将 TListView 和 TImageList 放在新表单上,将编辑器中的所有代码从界面剪切到最后结束的上方。如下:

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ImgList, ComCtrls;

type
TForm1 = class(TForm)
ImageList1: TImageList;
ListView1: TListView;
procedure FormShow(Sender: TObject);
private
{ Private declarations }
procedure CreateListItems;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

const
N = 50;
THUMB_WIDTH = 32;
THUMB_HEIGHT = 32;
THUMB_PADDING = 4;

var
thumbs: array[0..N-1] of TBitmap;

procedure CreateThumbnails;
var
i: Integer;
begin
for i := 0 to N - 1 do
begin
thumbs[i] := TBitmap.Create;
thumbs[i].SetSize(THUMB_WIDTH, THUMB_HEIGHT);
thumbs[i].Canvas.Brush.Color := RGB(Random(255), Random(255), Random(255));
thumbs[i].Canvas.FillRect(Rect(0, 0, THUMB_WIDTH, THUMB_HEIGHT));
end;
end;


procedure TForm1.CreateListItems;
var
i: Integer;
begin
for i := 0 to N - 1 do
begin
with ListView1.Items.Add do
begin
Caption := 'Item ' + IntToStr(i);
ImageIndex := i;
end;
end;
end;

procedure TForm1.FormShow(Sender: TObject);
var
i: Integer;
begin
CreateThumbnails;
for i := 0 to N - 1 do
ImageList1.Add(thumbs[i], nil);
ListView1.LargeImages := ImageList1;
CreateListItems;
end;

enter image description here

关于image - 在 tlistbox 中绘制缩略图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5412902/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com