旋转图像显示“内存不足”异常

本文关键字:内存不足 异常 图像 显示 旋转 | 更新日期: 2023-09-27 18:30:23

   public Bitmap rotateImage()
    {
      try
      {                      
          curImgHndl.CurrentRotationHandler.Flip(RotateFlipType.Rotate90FlipNone);
      }
      catch (Exception ex)
      {
      }
    return objCurrImageHandler.CurrentBitmap;
    }

当使用此功能多次旋转图像(5 次或更多)时,它会显示错误消息"记忆不足" .为了在 c#.net 4 中批准图像,我使用了 ImageFunctions.dll。反编译 dll 我得到了以下内容。

只给出用于旋转的整个代码的一部分

public class RotationHandler 
{
   private ImageHandler imageHandler;
   public void Flip(RotateFlipType rotateFlipType)
   {
      this.imageHandler.RestorePrevious();
      Bitmap bitmap = (Bitmap) this.imageHandler.CurrentBitmap.Clone();
      bitmap.RotateFlip(rotateFlipType);
      this.imageHandler.CurrentBitmap = (Bitmap) bitmap.Clone();
   }
}

我该如何解决?

以下方法解决了Lazyberezovsky建议的问题。

 public void Flip(RotateFlipType rotateFlipType)
  {
    this.imageHandler.RestorePrevious();
    this.imageHandler.CurrentBitmap.RotateFlip(rotateFlipType);
 }

但亮度方法的另一个问题。

    public void SetBrightness(int brightness)
    {
        Bitmap temp = (Bitmap)_currentBitmap;
            Bitmap bmap = (Bitmap)temp.Clone();
            if (brightness < -255) brightness = -255;
            if (brightness > 255) brightness = 255;
            Color c;
            for (int i = 0; i < bmap.Width; i++)
            {
                for (int j = 0; j < bmap.Height; j++)
                {
                    c = bmap.GetPixel(i, j);
                    int cR = c.R + brightness;
                    int cG = c.G + brightness;
                    int cB = c.B + brightness;
                    if (cR < 0) cR = 1;
                    if (cR > 255) cR = 255;
                    if (cG < 0) cG = 1;
                    if (cG > 255) cG = 255;
                    if (cB < 0) cB = 1;
                    if (cB > 255) cB = 255;
                    bmap.SetPixel(i, j, Color.FromArgb((byte)cR, (byte)cG, (byte)cB));
                }
            }
            _currentBitmap = (Bitmap)bmap.Clone();

    }

此方法适用于某些图像,不适用于其他图像,并显示以下错误"具有索引像素格式的图像不支持 SetPixel。"

如果您能为旋转、裁剪和亮度提供高效且可行的方法,那将非常有帮助。请再次提供帮助。

旋转图像显示“内存不足”异常

正如克劳迪奥提到的,你需要确保你正在处理任何未使用的Bitmaps

public void Flip(RotateFlipType rotateFlipType)
{
   this.imageHandler.RestorePrevious();
   Bitmap bitmap = (Bitmap) this.imageHandler.CurrentBitmap.Clone();
   this.imageHandler.CurrentBitmap.Dispose(); // dispose of current bitmap
   bitmap.RotateFlip(rotateFlipType);
   Bitmap clone_map = (Bitmap) bitmap.Clone();
   bitmap.Dipose(); // dispose of original cloned Bitmap
   this.imageHandler.CurrentBitmap = clone_map;
}

您可以将其简化为:

public void Flip(RotateFlipType rotateFlipType)
{
   this.imageHandler.RestorePrevious();
   Bitmap bitmap = (Bitmap) this.imageHandler.CurrentBitmap.Clone();
   this.imageHandler.CurrentBitmap.Dispose(); // dispose of current bitmap
   bitmap.RotateFlip(rotateFlipType);
   this.imageHandler.CurrentBitmap = bitmap;
}

为什么不旋转当前位图,而不是创建副本?

public class RotationHandler 
{
   private ImageHandler imageHandler;
   public void Flip(RotateFlipType rotateFlipType)
   {
      this.imageHandler.RestorePrevious();
      this.imageHandler.CurrentBitmap.RotateFlip(rotateFlipType);
   }
}