我在末日...试图获得自定义图片列表,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中的要求,谢谢!)
答案 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
的文档:
包含图像的位图的句柄。号码 从位图的宽度推断图像的数量。