TImagelist未添加位图

时间:2018-12-24 15:15:39

标签: delphi graphics 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像素。但是,使用3x 256x256像素填充了TImagelist的三项:可以从主图片“切出”的三张图片,仍然是256x256像素。所有垂直或水平小于256x256的边缘都将丢失。

1600x1600 导入了六个图像;完整256x256块的第一行,可以从图片顶部剪切。 tp右边的不完整块将被忽略,所有Y-size 256以下的行也将被忽略。

1500x1000 与上一个相似;现在导入了五个项目。

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

197x256(我的原始测试文件,如上所述) 没有导入任何项目(X尺寸小于TImaglist X尺寸吗?)

256x256 再次,未导入数据

257x257 仍然没有数据导入

260x260 仍然没有数据导入

300x300 仍然没有数据导入

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

所以这是我现在停止测试的地方,想知道是否有人可以在这里透露一些信息...?

编辑:设计部分移至新问题(请参见注释kobik中的要求,谢谢!)

1 个答案:

答案 0 :(得分:4)

假设您的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的工作方式。如果添加的位图大于imagelist宽度,则会尝试将位图分成单独的位图以适合imagelist的大小。这是设计使然。

有关hbmImage参数的信息,请参见有关ImageList_Add的文档:

  

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