gpt4 book ai didi

c# - 当创建大量位图图像并将其保存为每像素图像一位时,物理内存使用异常

转载 作者:行者123 更新时间:2023-11-30 15:27:43 26 4
gpt4 key购买 nike

我正在尝试从 base 64 字符串创建大量每像素 1 位的 bmp 图像并保存。根据要求,在短时间内创建了大量图像(短时间内平均为 50,000 到 1,00,000)。我正在使用以下代码。

  public void CreateoneBppImageAndSave(String base64ImageString,String ImagePathToSave)
{
byte[] byteArray = Convert.FromBase64String(base64ImageString);

System.Drawing.Image img = byteArrayToImage(byteArray);
Bitmap objBitmap = new Bitmap(img);

BitmapData bmpData = objBitmap.LockBits(new Rectangle(0, 0, objBitmap.Width, objBitmap.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format1bppIndexed);
Bitmap oneBppBitmap = new Bitmap(objBitmap.Width, objBitmap.Height, bmpData.Stride, System.Drawing.Imaging.PixelFormat.Format1bppIndexed, bmpData.Scan0);

oneBppBitmap.Save(ImagePathToSave, ImageFormat.Bmp);
img.Dispose();
objBitmap.Dispose();
objBitmap.UnlockBits(bmpData);
oneBppBitmap.Dispose();
}

private Image byteArrayToImage(byte[] byteArrayIn)
{
using (MemoryStream ms = new MemoryStream(byteArrayIn))
{
return Image.FromStream(ms);
}
}

此处物理内存使用率非常高。通常生成的图像大小为 200x200 到 754x1024。在一定时间后物理内存使用率达到极限并抛出内存不足异常。物理内存每 5-10 秒增加 0.01 GB。请帮助我在内存使用方面优化代码

最佳答案

您在 objBitmap 上调用了 LockBits,但是在 oneBppBitmap 上调用了 UnlockBits。您应该在调用锁定的同一对象上调用解锁。

至于像我在评论中提到的using 语句,using 语句可以解决这个问题

using(SomeType obj = new SomeType())
{
// Some code
}

相当于这个

SomeType obj = new SomeType())
try
{
// Some code
}
finally
{
obj.Dispose();
}

这保证即使在 //Some Code 中抛出异常,dispose 操作仍然会发生。如果您在创建和处置之间的任何函数抛出异常,您的代码将不会处置其任何对象。

这是一个重写的版本,其中包含我提到的所有更正以及其他一些......

public void CreateoneBppImageAndSave(String base64ImageString,String ImagePathToSave)
{
byte[] byteArray = Convert.FromBase64String(base64ImageString);

using(Image img = byteArrayToImage(byteArray))
using(Bitmap objBitmap = new Bitmap(img))
{
BitmapData bmpData = objBitmap.LockBits(new Rectangle(0, 0, objBitmap.Width, objBitmap.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format1bppIndexed);
try
{
using(Bitmap oneBppBitmap = new Bitmap(objBitmap.Width, objBitmap.Height, bmpData.Stride, System.Drawing.Imaging.PixelFormat.Format1bppIndexed, bmpData.Scan0))
{
oneBppBitmap.Save(ImagePathToSave, ImageFormat.Bmp);
}
}
finally
{
//put the unlock in a finally to make sure it happens.
objBitmap.UnlockBits(bmpData);
}
}
}

编辑:如果这确实在您的代码中

objBitmap.Dispose();
objBitmap.UnlockBits(bmpData);

这就是问题的根源,处理后不应在类上调用任何方法。这是 using 的另一个好处,您不能延迟调用方法,因为当您离开 using block 时变量超出范围。

关于c# - 当创建大量位图图像并将其保存为每像素图像一位时,物理内存使用异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26974586/

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