【问题标题】:C# picture box Image dissapearingC#图片框图片消失
【发布时间】:2017-10-18 05:39:59
【问题描述】:

我在我的 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();

}

【问题讨论】:

  • Big red x 表示Paint 事件处理程序中未处理的异常。要查看哪一个:将其包含在try/catch(Exception e) {} 中并在catch 中设置断点。
  • 规则是,对于持久结果,您应该使用Paintevent 及其e.Graphics 对象来在PBox 表面上绘制 .然而,对于到图像位图,您可以并且应该编写一些其他事件/方法,因为该位图将始终存在! Paint 事件会在各种场合被系统调用,所以不要在里面放不属于那里的东西!

标签: c# image picturebox


【解决方案1】:

你绝对不应该在这样的 Paint() 事件中使用Image.FromFile();设置一次,然后使用 Paint() 事件中提供的图形简单地绘制你的圆圈:

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);
        }                
    }
}

【讨论】:

  • 当我这样做时(就像我开始的那样)我得到一个白色的图像。
  • 那么我们需要更多细节,更好地了解您的应用程序。
猜你喜欢
  • 2013-10-25
  • 2019-09-07
  • 2016-10-05
  • 1970-01-01
  • 2017-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-18
相关资源
最近更新 更多