【问题标题】:Bitmap Region is already locked exception位图区域已锁定异常
【发布时间】:2012-12-15 09:00:35
【问题描述】:

我正在使用此代码:

internal static Image ColorReplacer(Image Img, Color oldcolor, Color newcolor, int tolerence)
        {
            // Gotten From -> Code Project
            Bitmap bmap = (Bitmap)Img.Clone();
            Color c;
            int iR_Min, iR_Max; int iG_Min, iG_Max; int iB_Min, iB_Max;
            //Defining Tolerance
            //R
            iR_Min = Math.Max((int)oldcolor.R - tolerence, 0);
            iR_Max = Math.Min((int)oldcolor.R + tolerence, 255);
            //G
            iG_Min = Math.Max((int)oldcolor.G - tolerence, 0);
            iG_Max = Math.Min((int)oldcolor.G + tolerence, 255);
            //B
            iB_Min = Math.Max((int)oldcolor.B - tolerence, 0);
            iB_Max = Math.Min((int)oldcolor.B + tolerence, 255);

            for (int x = 0; x < bmap.Width; x++)
            {
                for (int y = 0; y < bmap.Height; y++)
                {
                    c = bmap.GetPixel(x, y);
                    //Determinig Color Match
                    if ((c.R >= iR_Min && c.R <= iR_Max) &&
                        (c.G >= iG_Min && c.G <= iG_Max) &&
                        (c.B >= iB_Min && c.B <= iB_Max)
                       )
                        if (newcolor == Color.Transparent)
                            bmap.SetPixel(x, y, Color.FromArgb(0, newcolor.R, newcolor.G, newcolor.B));
                        else
                            bmap.SetPixel(x, y, Color.FromArgb(c.A, newcolor.R, newcolor.G, newcolor.B));
                }
            }
            return (Image)bmap.Clone();
        }

此代码运行良好。它成功地将我的白色图标图像更改为另一种颜色。 问题是:一旦我改变它,我就不能再改变它了。它给了我“位图区域已锁定异常”。我假设这是因为 GetPixel() 正在锁定图像?

任何人都可以提出一个解决这个问题的好方法吗?

PS:我知道 GetPixel() 是一个非常慢的方法,但是,我使用的是 8 张图像,它们都是 24px。它们非常小,所以我认为 GetPixel() 的性能不是什么大问题。

【问题讨论】:

    标签: c# visual-studio-2010 image visual-studio colors


    【解决方案1】:

    我刚刚测试了您的代码,并且它正确执行(即,我能够在每次使用不同颜色的单个图像上多次调用 ColorReplacer,然后将其绘制到表单上)。

    您能否提供您正在使用的调用您的 ColorReplacer 方法的代码示例?

    【讨论】:

    • 当然。 Button1.Image = ColorReplacer(Button1.Image, Color.White, Clr, 50); Button1 图像是从设计文件中“导入”的(不在资源中)。
    • 当您再次尝试调用 ColorReplacer 时,哪一行会引发异常?是GetPixel/SetPixel,还是Clone?
    • GetPixel() 引发异常。
    • 抱歉 - 我无法重现该错误。我用一个按钮制作了一个表单,每次单击该按钮时,它都会像您的示例一样运行“button1.Image = ColorReplacer(...)”,并且它一直在工作!
    • 你是对的。我这样做是这样的:处理选项加载选项形式。在选项表单关闭重新加载/更改颜色。该过程导致错误,但我仍然对如何修复它有点困惑。
    【解决方案2】:

    您需要按照以下流程通过锁定和解锁图像数据来更改颜色:

    http://msdn.microsoft.com/en-us/library/system.drawing.bitmap.unlockbits.aspx

    【讨论】:

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