【问题标题】:Bitmap region is already locked位图区域已被锁定
【发布时间】:2023-03-22 10:44:02
【问题描述】:
string pathFile = @"C:\Users\user\Downloads\CaptchaCollection\Small\Sorted\";

var files = Directory.GetFiles(pathFile).Select(nameWithExtension => Path.GetFileNameWithoutExtension(nameWithExtension)).Where(name => { int number; return int.TryParse(name, out number); }).Select(name => int.Parse(name)).OrderBy(number => number).ToArray();
List<int> fileList = files.ToList();

image1 = new Bitmap(pathFile + fileList[0].ToString() + ".png");
image2 = new Bitmap(pathFile + fileList[1].ToString() + ".png");

if (compare(image2, image2))
{
    // if it's equal
    File.Delete(image2.ToString());
}

所以基本上我现在拥有的是每个文件都是数字的(没有扩展名)。我创建了一个数组,然后将其转换为一个列表。

我使用我的全局变量image1image2 来比较它们是否相同。

image1image2 在搜索过程中发生变化。所以它改变了索引。

如果我的 compare() 方法返回 true,它将删除第二张图像。

但是,在 compare() 方法上,我似乎在这一行收到了这个异常错误:

BitmapData bmpData2 = bmp2.LockBits(rect, ImageLockMode.ReadOnly, bmp2.PixelFormat);

【问题讨论】:

  • 向我们展示完整的可重现代码
  • @AlvinWong 在我发布的链接上(代码审查)codereview.stackexchange.com/questions/39980/…
  • 您是否将位锁定在某处但忘记调用 UnlockBits?
  • @AlvinWong 在方法代码的底部会说bmp1.UnlockBits(bmpData1); bmp2.UnlockBits(bmpData2); 我相信异常出现在方法的第二部分

标签: c# bitmap invalidoperationexception


【解决方案1】:

嗯,实际上我花了很长时间才注意到这一行:

if (compare(image2, image2))

您将相同的Bitmap 传递给函数compare,因此当函数尝试在同一Bitmap 上调用LockBits 两次时,会发生此异常。

所以为了修复它,不要将相同的位图传递给函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    • 2011-03-10
    • 1970-01-01
    • 2021-06-06
    相关资源
    最近更新 更多