我有一个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
的限制吗?
我需要在ListView
(ListView.View = View.Tile
)中显示超过10,000张(依赖于计数)的图像。如果ImageList
有限制,如何在不使用ImageList
的情况下进行制作?