【发布时间】: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