gpt4 book ai didi

.net - .NET ImageList 实现中的 ImageList 容量错误?

转载 作者:行者123 更新时间:2023-12-04 12:52:32 25 4
gpt4 key购买 nike

我在 .net 应用程序中为我的 ListView 使用 ImageList 时遇到了一些问题。在我的实现中,根据使用情况,这个 ImageList 可以容纳几千张图像。这个问题最初是在我尝试处理大量图像时出现的。一旦超过 5K+ 图像,我在尝试添加图像时遇到了一个通用的“图像无法添加到 ImageList”异常。发生此故障的确切数字略有增加。

因此,在尝试解决此问题时,我尝试使用 native ImageList_SetImageCount 函数扩展 ImageList 的容量。那很好,解决了我眼前的问题。我必须使用 ImageList[index] = image 而不是 .Add() 方法来填充列表。
这一切都很好,但是当需要提取图像时,问题就出现了。现在,每当我通过索引引用该 ImageList 中的图像时,都会出现内存不足异常。 Bitmap x = ImageList[any index] 会崩溃。

我尝试了很多不同的方法,但仍然遇到 ImageList 的问题。

在我最后一次进一步探索该问题的尝试中,我整理了以下仍然表现奇怪的测试代码!

    private void Form1_Load(object sender, EventArgs e)
{
list = new ImageList();
list.ImageSize = new Size(128, 128);
list.ColorDepth = ColorDepth.Depth32Bit;
Image[] images = new Image[10];
for (int y = 0; y < 10; y++)
{
images[y] = new Bitmap(@"Path to loading_photo.png");
}
for (int x = 0; x < 750; x++)
{
list.Images.AddRange(images);
}

list.Images[12] = new Bitmap(@"Path to another.png");

最后一行因“图像无法添加到 ImageList”错误而崩溃。奇怪的是,将第二个循环设置为较低的迭代(即总共添加 2000 张图像时为 200)它表现得很好。

.net 中的 ImageList 是否有我不知道的特定阈值?任何帮助将不胜感激。

最佳答案

我无法通过发布的代码获得任何重现。然而,重要的是要意识到 ImageList 制作了位图的副本。所以你应该在添加之后调用位图的 Dispose() 方法。如果不这样做,则存在严重的风险,即您将耗尽非托管内存,被位图数据消耗,并且当垃圾收集器运行不频繁而无法在您之后进行清理时会致命。这不适用于代码段,因为只有 10 个位图。

关于.net - .NET ImageList 实现中的 ImageList 容量错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10180954/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com