C# 用看似简单的图形方法C处理多个间歇性错误

C# 用看似简单的图形方法C处理多个间歇性错误,c#,colors,picturebox,trackbar,C#,Colors,Picturebox,Trackbar,我有一个简单的方法,可以分析pictureBox中的样本图像并增加红色通道的值。类似的其他方法分析其他颜色通道。用户可以选择包含所需颜色变化的样本图像,并将其应用于原始图像 一切正常,直到我添加了一个轨迹栏,使用户可以更改他们想要添加到样本图像中或从样本图像中减去多少红色、绿色或蓝色。现在,在第一次运行时,一切有时都很好。我得到了一个跨线程操作无效的错误,但我似乎已经解决了这个问题。第一次运行后,pictureBox1通常会随机消失,并被可怕的红色X取代。其他时候,pictureBox1会在满功

我有一个简单的方法,可以分析pictureBox中的样本图像并增加红色通道的值。类似的其他方法分析其他颜色通道。用户可以选择包含所需颜色变化的样本图像,并将其应用于原始图像

一切正常,直到我添加了一个轨迹栏,使用户可以更改他们想要添加到样本图像中或从样本图像中减去多少红色、绿色或蓝色。现在,在第一次运行时,一切有时都很好。我得到了一个跨线程操作无效的错误,但我似乎已经解决了这个问题。第一次运行后,pictureBox1通常会随机消失,并被可怕的红色X取代。其他时候,pictureBox1会在满功率下应用其颜色变化,而不管轨迹栏设置如何。其他时候,我会收到一个错误,说明对象当前正在其他地方使用。就我对这个概念的理解而言,我已经尝试过锁定出错的代码,但是没有效果。我在这里和其他地方都对这些问题进行了非常彻底的研究,但除了我已经实施的解决方案之外,没有找到其他解决方案。代码如下:

编辑:FWIW,我刚刚得到一个罕见的对象没有设置为对象错误的实例,关于int y。我无法重现它。另外,我很好奇,当我运行多个方法(如红色、绿色和蓝色)时,除了从pictureBox单击中运行它们之外,还有其他更好的方法来运行它们吗

我的主要问题仍然是pictureBox1中的间歇性红色X,而间歇性但频繁的对象目前正在其他地方使用。错误多谢各位

    private object lockObject = new object();    

    private void red()
    {
            // declare initial variables 
            int xRed = 64;

            // Work around for "Cross-thread operation not valid" error.  This may be a VS issue, not an actual coding error. 
            if (trkColor.InvokeRequired)
                trkColor.Invoke(new MethodInvoker(delegate { xRed = trkColor.Value; }));
            else
                xRed = trkColor.Value;

            // Get bitmap from picturebox
            Bitmap bmp = (Bitmap)pictureBox1.Image;

            lock (lockObject)
            {

            // search through each pixel via x, y coordinates, examine and make changes. Dont let values exceed 255 or fall under 0.  
            for (int y = 0; y < bmp.Height; y++)
                for (int x = 0; x < bmp.Width; x++)
                {
                    Color c = bmp.GetPixel(x, y);
                    int myRed = c.R, myGreen = c.G, myBlue = c.B;
                    myRed += xRed;
                    if (myRed > 255)
                        myRed = 255;
                    bmp.SetPixel(x, y, Color.FromArgb(255, myRed, myGreen, myBlue));
                }

            // assign the new bitmap to the picturebox
            pictureBox1.Image = (Bitmap)bmp;
            }
    }

//将新位图分配给picturebox也必须在UI线程上完成…我对此非常陌生,不太熟悉线程。所以如何在UI线程上执行此操作?非常感谢。