C#图片框图像消失

时间:2017-05-18 12:02:15

标签: c# image picturebox

我在我的C#代码中使用带有给定图像的图片框。 我在Pain事件中执行所有绘制操作(请参阅下面的代码)。 当图像需要更新时(在它上面有点)我调用Invalidate使其重新绘制。然而,经过一段时间后,图像和点消失,并被填充图片框的红色边框中的大红色X取代。 请注意,图像作为exe文件保存在保存文件夹中。并且最初看起来很好(与点相同)。

我在做错了什么? 交叉问题?

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
    setImage = Image.FromFile("IMG_1612.png");
    Pen p = new Pen(Color.Red);
    var g = Graphics.FromImage(setImage);//e.Graphics;

    g.DrawImage(setImage,0,0);

    foreach (Circles element in _circles)
    {
        g.FillEllipse(new SolidBrush(element.color), element.Punt.X, element.Punt.Y, _CIRCLESIZE, _CIRCLESIZE);
    }

    this.pictureBox1.Image = setImage;
    g.Dispose();

}

delegate void PicturBoxUpdate(Control control);

private void UpdatePictureBox(Control control)
{
    // InvokeRequired required compares the thread ID of the  
    // calling thread to the thread ID of the creating thread.  
    // If these threads are different, it returns true.  
    if (control.InvokeRequired)
    {
        PicturBoxUpdate d = new PicturBoxUpdate(UpdatePictureBox);
        this.Invoke(d, new object[] { control});
    }
    else
    {
        control.Invalidate();
        control.Update();
    }
}

private void DataProcessing(string data)
{            
    data = data.Replace('<', ' ').Replace('>',' ').Trim();
    string[] processingdata = data.Split(';');
    Circles tempCircle;
    for (int i = 0; i < processingdata.Length-2;i++)
    {
        _data[i] = Convert.ToByte(processingdata[i], 16);
        BitArray localdata = new BitArray(BitConverter.GetBytes(_data[i]).ToArray());
        switch(i)
        {
            case 0:
                if (_data[i] == 0xAA)
                {
                    tempCircle = _circles[5];
                    tempCircle.color = Color.Green;
                    _circles[5] = tempCircle;

                    tempCircle = _circles[4];
                    tempCircle.color = Color.Green;
                    _circles[4] = tempCircle;
                }
                else
                {
                    if (localdata.Get(1) & !localdata.Get(2))
                    {
                        tempCircle = _circles[5];
                        tempCircle.color = Color.Orange;
                        _circles[5] = tempCircle;

                        tempCircle = _circles[4];
                        tempCircle.color = Color.Orange;
                        _circles[4] = tempCircle;
                    }
                    if (localdata.Get(3) & !localdata.Get(0))
                    {
                        tempCircle = _circles[5];
                        tempCircle.color = Color.Blue;
                        _circles[5] = tempCircle;
                    }
                    if (localdata.Get(5) & !localdata.Get(4))
                    {
                        tempCircle = _circles[4];
                        tempCircle.color = Color.Blue;
                        _circles[4] = tempCircle;
                    }
                    if (localdata.Get(7) & !localdata.Get(6))
                    {
                        tempCircle = _circles[4];
                        tempCircle.color = Color.Purple;
                        _circles[4] = tempCircle;

                        tempCircle = _circles[5];
                        tempCircle.color = Color.Purple;
                        _circles[5] = tempCircle;
                    }
                }

                break;
            case 1:                            
                break;   
            default:
                break;
        }    
    }

    UpdatePictureBox(pictureBox1);
    GC.Collect();

}

1 个答案:

答案 0 :(得分:1)

你绝对不应该像Paint那样在Paint()事件中使用Image.FromFile();设置一次并使用Paint()事件中提供的Graphics简单绘制圆圈:

private Image setImage;

private void Form1_Load(object sender, EventArgs e)
{
    setImage = Image.FromFile("IMG_1612.png");
    pictureBox1.Image = setImage;
}

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
    var g = e.Graphics;
    foreach (Circles element in _circles)
    {
        using (SolidBrush B = new SolidBrush(element.Color))
        {
            g.FillEllipse(B, element.Punt.X, element.Punt.Y, _CIRCLESIZE, _CIRCLESIZE);
        }                
    }
}