首页 > 解决方案 > TImagelist 不添加位图

问题描述

我已经走到了尽头......试图让一个自定义的图片列表、一个 TImageList 和一个 TListView 一起工作。原问题:列表中不显示动态添加的图片。缩小范围,问题出在 TImagelist 中。代码如下。ilMain 是 TImagelist(在别处定义)。将位图添加到列表中,立即检索它,首先“绘制”工作正常,但 sedond 失败......我在这里错过了什么?

var i:integer;
  test:TSch;
  currentimage :TBitmap;
  stupid :TBitmap;

begin
  currentImage:=TBitmap.Create;
  stupid:=TBitmap.Create;
  ilMain.Clear;
//  currentImage.LoadFromFile('C:\Delphi\piccat\pics\MonaLisa.jpg');
  JPeg2Bmp('C:\Delphi\piccat\pics\MonaLisa.jpg',currentImage);

  form1.canvas.Draw(100,10,currentimage);
  ilMain.Add(currentimage,nil);
  ilMain.GetBitmap(0,stupid);
  form1.canvas.Draw(200,10,stupid);

编辑:

对此做了一些进一步的测试;结果非常混乱和不一致。

结果实际上很大程度上取决于输入文件的大小(感谢那个指针,kobik!);似乎小于 256x256 的所有内容都没有导入到图像列表中,而沿 X 轴的较大图片(有时??)分布在多个项目上。

ilMain 设置为 256x256 像素。

下面是几个输入尺寸(X x Y,以像素为单位)的输出: 950x414 第一次绘制显示整个图像,第二次在左上角绘制 256x256 像素。但是,填充了 TImagelist 的三个项目,具有 3x 256x256 像素:可以从主图片“切出”的三张图片仍然是 256x256 像素。所有小于 256x256 的边缘(垂直或水平)都将丢失。

1600x1600 导入六张图片;第一行完整的 256x256 块,可以从图片顶部切割。tp 右侧的不完整块被省略,Y 大小 256 以下的所有行也被省略。

1500x1000 同上一张;现在进口五件。

638x376 再次相似;现在只有两个项目“适合”。

197x256(我的原始测试文件,在上面的帖子中描述)没有导入项目(X-size 小于 TImaglist X-size?)

再次 256x256,未导入数据

257x257 仍然没有数据导入

260x260 仍然没有导入数据

300x300 仍然没有导入数据

512x256 非常奇怪的一个。导入一张图片;但是它的尺寸减小了,因此大约 70% 的原始图片适合(新的)256 X 尺寸。图片下方添加了一个黑条,以弥补由于这种收缩而丢失的空间。

所以这就是我现在停止测试的地方,想知道是否有人可以在这里阐明......?

编辑:设计部分移至新问题(请参阅评论 kobik 中的请求,谢谢!)

标签: delphigraphicstimagelist

解决方案


JPeg2Bmp假设您的代码是正确的,您的代码可以工作(或至少需要工作) 。我猜@Dima 的第二条评论是正确的。

你没有显示ilMain属性,如果你使用默认值,你会得到一个带有Width/Height=16.

尝试省略对 的第一次调用form1.canvas.Draw(100,10,currentimage);,只绘制form1.canvas.Draw(200,10,stupid);and 你应该16x16在位置 200,10 看到一个绘图。

TImagelist 无法加载任意尺寸的图像
您需要预先定义它的大小,并加载合适大小的位图。即创建缩略图以适应图像列表的尺寸。

另请注意(您可能知道)您只需要在响应WM_PAINT消息时进行绘制。例如在 FormOnPaint事件中。

编辑:关于您的编辑,这就是TImageList工作方式。如果您添加的位图大于图像列表的宽度,它将尝试将位图分解为单独的位图以适应图像列表的大小。这是设计使然。

ImageList_Add请参阅有关参数的文档hbmImage

包含图像的位图句柄。图像的数量是从位图的宽度推断出来的。


推荐阅读