Delphi TImagelist未添加位图
我已经穷途末路了。。。正在尝试获取自定义图片列表、TImageList和TListView以协同工作。原始问题:列表中未显示动态添加的图片。缩小范围,问题在时间列表中。代码如下。ilMain是TImagelist(在别处定义)。将位图添加到列表中,立即检索,第一次“绘制”效果良好,但sedond失败。。。我错过了什么Delphi TImagelist未添加位图,delphi,graphics,timagelist,Delphi,Graphics,Timagelist,我已经穷途末路了。。。正在尝试获取自定义图片列表、TImageList和TListView以协同工作。原始问题:列表中未显示动态添加的图片。缩小范围,问题在时间列表中。代码如下。ilMain是TImagelist(在别处定义)。将位图添加到列表中,立即检索,第一次“绘制”效果良好,但sedond失败。。。我错过了什么 var i:integer; test:TSch; currentimage :TBitmap; stupid :TBitmap; begin currentIm
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的图片都没有导入到imagelist中,而沿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中的请求,谢谢!)假设您的JPeg2Bmp
正确,您的代码可以工作(或至少需要工作)。我想@Dima的第二个评论是正确的
您尚未显示ilMain
属性,如果使用默认值,则会得到一个宽度/高度为16的图像列表
尝试省略对form1.canvas.Draw(100,10,currentimage)的第一次调用
,并仅绘制form1.canvas.draw(200,10,愚蠢)代码>并且您应该在位置200,10处看到16x16
图纸
TImagelist
无法加载任意大小的图像
您需要预先定义它的大小,并加载具有适当大小的位图。i、 e.创建缩略图以适应imagelist尺寸
还请注意(您可能知道),您只需要在响应WM_PAINT
消息时进行绘制。e、 g.以OnPaint
事件的形式
编辑:关于您的编辑,这就是TImageList
的工作原理。如果添加的位图大于imagelist宽度,它将尝试将位图拆分为单独的位图以适合imagelist大小。这是故意的
请参阅有关hbmImage
参数的文档:
包含一个或多个图像的位图句柄。号码
从位图的宽度推断图像的宽度
我看你的代码没有任何问题。也许,问题在于添加位图的索引。只能为零索引检索位图。因此,您总是首先添加位图,而其他位图仍然放在TImageList
中。尝试将以下内容替换为:ilMain.GetBitmap(0,愚蠢)`
ilMain.GetBitmap(ilMain.Add(currentimage,nil),愚蠢)`。只是一个建议……或者只是另外一个想法:currentimage
位图的大小很大(超过200x200像素),所以“第二次绘制”是在已经绘制的currentimage
上执行的,因此您不会注意到第二个图像“隐藏”在currentimage
上。后退一步,深呼吸,放松。做一个决定。使代码尽可能清晰。贴出来。迪玛,不,照片会显示出来。显然,这是测试代码,所以是的,索引是硬编码的,一旦我让它工作,显然会使它成为动态的。。。顺便说一句,您建议的更改会得到相同的结果。代码不完整。请参阅上面我的测试数据。。。如果我把一张256x256的图片添加到一张256x256的图片列表中,那应该可以了,对吧?@Jur,是的。对我来说确实如此。导入比TImageList的X-Y更小的文件有什么问题吗?我的意思是,例如,将64x64导入256x256图像列表?当你把其他属性(除了宽度/高度)放到表单上时,你会调整它们的默认值吗?@jur-a的位置是问题,而不是答案。你需要知道你到底在做什么,这样你的问题才能被发现。