【问题标题】:TImagelist not adding bitmapTImagelist 不添加位图
【发布时间】:2019-05-23 17:10:48
【问题描述】:

我快要完蛋了...试图获得一个自定义的图片列表,一个 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-size 256以下的所有行也被省略。

1500x1000 与上一个类似;现已导入五件商品。

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

197x256(我的原始测试文件,在上面的帖子中描述) 未导入任何项目(X 尺寸小于 TImaglist X 尺寸?)

256x256 再次,没有数据导入

257x257 仍然没有导入数据

260x260 仍然没有导入数据

300x300 仍然没有导入数据

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

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

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

【问题讨论】:

  • 好吧,我看不出你的代码有什么问题。也许,问题在于添加的位图的索引。您检索位图 only 用于零索引。因此,您总是首先获得添加的位图,而其他位图仍放置在 TImageList 中。尝试替换这个:ilMain.GetBitmap(0,stupid)' with this: ilMain.GetBitmap(ilMain.Add(currentimage,nil),stupid)`。只是一个建议。
  • ...或者只是额外的想法:currentimage 位图尺寸很大(超过 200x200 像素。),所以“第二次绘制”over 已经绘制了@987654326 @,因此您不会注意到第二张图片,因为它“隐藏”在 currentimage 上。
  • 退后一步,深呼吸,放松。制作minimal reproducible example。使代码尽可能清晰。发布。
  • Dima,不,图片会显示。显然这是测试代码,所以是的,索引是硬编码的,一旦我让它工作,显然会使其动态......你建议的更改会得到相同的结果。
  • 代码不完整。

标签: delphi graphics timagelist


【解决方案1】:

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

您还没有显示ilMain 属性,如果您使用默认值,您将获得一个带有Width/Height=16 的图像列表。

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

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

还请注意(您可能知道)您只需要在响应WM_PAINT 消息时进行绘图。例如在表单OnPaint 事件中。

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

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

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

【讨论】:

  • 好吧,看看我上面的测试数据...如果我将 256x256 图片添加到 256x256 TImageList,那应该可以,对吧?
  • @Jur,是的。它对我有用。
  • 您在导入比 TImageList 的 X-Y 更小的文件时是否遇到任何问题?我的意思是,例如,将 64x64 导入 256x256 图像列表?当您将其放在表单上时,您是否会调整任何其他属性(除了宽度/高度)?
  • @jur - minimal reproducible example 的位置是问题,而不是答案。正是您需要知道自己在做什么,这样才能确定您的问题。
猜你喜欢
  • 2012-05-31
  • 1970-01-01
  • 2015-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-06
  • 1970-01-01
相关资源
最近更新 更多