delphi - 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 中的请求,谢谢!)
解决方案
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
:
包含图像的位图句柄。图像的数量是从位图的宽度推断出来的。
推荐阅读
- mysql - 如何将使用mysql workbench制作的mysql数据库导入django?
- python - 如何检查列表中同一元素的多个实例?
- observable - @ngrx/store 是可观察的热还是冷?
- angularjs - 从文件中获取数据并写入文件
- jenkins - 使用 github webhooks 构建参数化 jenkins
- javascript - 针对 HackerRank 问题的算法/代码改进
- javascript - javascript中的值计数
- bash - 如何编写将为 mac osx doc 创建快捷方式的 bash 脚本?
- angular - Angular 7:将 HTML 转换为 PDF
- angular - 如何在使用角度服务工作者时指定要缓存的特定 URL?