C# .NET Bitmap.Clone()抛出OutOfMemoryException

C# .NET Bitmap.Clone()抛出OutOfMemoryException,c#,bitmap,C#,Bitmap,为什么下面的简单代码(bitmap.Clone)抛出OutOfMemoryException List<Bitmap> bitmapList = new List<Bitmap>(); try { for (int i = 0; i < 1000; ++i) { using (Bitmap bitmap = new Bitmap(@"C:\

为什么下面的简单代码(bitmap.Clone)抛出OutOfMemoryException

        List<Bitmap> bitmapList = new List<Bitmap>();
        try
        {
            for (int i = 0; i < 1000; ++i)
            {
                using (Bitmap bitmap = new Bitmap(@"C:\temp\test.gif"))
                //using (Bitmap bitmap = new Bitmap(bitmap2))
                {
                    Bitmap clonedBitmap = bitmap.Clone(new Rectangle(0, 0, bitmap.Width, bitmap.Height), PixelFormat.Format8bppIndexed);
                    bitmapList.Add(clonedBitmap);
                    Debug.WriteLine("round " + i);
                }
            }
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex);
        }
        finally
        {
            foreach (Bitmap bitmap in bitmapList)
            {
                bitmap.Dispose();
            }
        }
异常中的HResult为0x8007000e,根据Microsoft文档,这可能意味着内存不足以及其他许多问题。可能是一些本机资源问题,但为什么它应该像这样表现出来,并通过制作一个额外的位图来纠正

原因也不是GIF图像格式,我尝试过JPG和PNG图像,同样的问题出现了


我的真正目的是将24位RGB位图转换为索引8位位图。但是,克隆生成的图像质量不是很高。有谁知道转换为8位索引位图的质量更好的方法吗?或者我必须从头开始,包括调色板量化吗?

不为我复制,你能分享你正在使用的图像吗?我认为图像无关紧要,我可以用许多不同的图像复制它。上面示例中使用的测试图像(test.gif)约为13.7 MB。对于较小的图像,您可能需要循环1000次以上,请尝试较大的循环次数。
                using (Bitmap bitmap2 = new Bitmap(@"C:\temp\test.gif"))
                using (Bitmap bitmap = new Bitmap(bitmap2))
                {