我有一个简单的方法来分析pictureBox中的示例图像并增加Red通道的值。类似的其他方法分析其他颜色通道。用户可以选择包含所需颜色变化的样本图像并将其应用于原始图像。
一切正常,直到我添加了一个trackBar,使用户能够更改他们想要添加到样本图像或从样本图像中减去多少红色,绿色或蓝色。现在,一切都在第一次运行时有效。我得到了“跨线程操作无效”错误,但我似乎已经解决了这个问题。首次运行后,pictureBox1经常随机消失并被可怕的红色X取代。其他时候,无论trackBar设置如何,pictureBox1都会以全功率应用颜色变化。其他时候,我收到一条错误,指出“对象目前正在其他地方使用”。基于我对该概念的理解,我尝试锁定出错的代码,但这没有任何效果。我已经非常彻底地研究了这里和其他地方的这些问题,但没有找到解决方案(除了我已经实现的那些)。代码如下:
编辑:FWIW,我刚刚得到一个罕见的“对象没有设置为对象的实例”错误,关于int y。我无法重新创建它。另外,我很好奇,当我运行多个方法,如red(),green()和blue()时,是否有一种首选的方式来运行它们(除了运行它们,例如,一个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;
}
}