C# .NET Bitmap.Clone()抛出OutOfMemoryException
为什么下面的简单代码(bitmap.Clone)抛出OutOfMemoryExceptionC# .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:\
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))
{