图片无法添加到ImageList

时间:2016-03-18 10:49:21

标签: c# .net winforms

我有一个System.Windows.Forms.ImageList“_ imageList”。 以下是我的示例代码。

_imageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;

Image imageStamp;
int imgCount = 5000
for( int idx = 0; idx < imgCount; idx++ )
{
   imageStamp = Image.FromFile(filename);
   _imageList.Images.Add( imageResult[idx].Key, imageStamp );
   imageStamp.Dispose();
   imageStamp = null;

}

但是在加载超过4000张图片后,我收到InvalidOperationException“图片无法添加到ImageList”。堆栈跟踪如下所示。

at System.Windows.Forms.ImageList.AddToHandle(Original original, Bitmap bitmap)
   at System.Windows.Forms.ImageList.ImageCollection.Add(Original original, ImageInfo imageInfo)
   at System.Windows.Forms.ImageList.ImageCollection.Add(String key, Image image)

如何解决此问题?

在此操作过程中,我的流程的内存用法为〜 114,872K 句柄为〜 1031 。使用Windows taskmanager进行检查。 当我使用Reflector检查ImageList中的代码时,

private int AddToHandle(Original original, Bitmap bitmap)
{
    IntPtr monochromeMask = ControlPaint.CreateHBitmapTransparencyMask(bitmap);
    IntPtr handle = ControlPaint.CreateHBitmapColorMask(bitmap, monochromeMask);
    int num = SafeNativeMethods.ImageList_Add(new HandleRef(this, this.Handle), new HandleRef(null, handle), new HandleRef(null, monochromeMask));
    SafeNativeMethods.DeleteObject(new HandleRef(null, handle));
    SafeNativeMethods.DeleteObject(new HandleRef(null, monochromeMask));
    if (num == -1)
    {
        throw new InvalidOperationException(SR.GetString("ImageListAddFailed"));
    }
    return num;
}

如果我修改上面的for循环以使用Dictionary<string, Image>而不是ImageList,则可以将5000张图像(可能是更多图像)添加到词典中而不会出现任何错误。

for( int idx = 0; idx < imgCount; idx++ )
{
   imageStamp = Image.FromFile(filename);
   // _imageList.Images.Add( imageResult[idx].Key, imageStamp );
   // imageStamp.Dispose();
   // imageStamp = null;
   _imageListDictionary.Add( imageResult[idx].Key, imageStamp );
}

这是ImageList的限制吗? 我需要在ListViewListView.View = View.Tile)中显示超过10,000张(依赖于计数)的图像。如果ImageList有限制,如何在不使用ImageList的情况下进行制作?

0 个答案:

没有答案