C#图片框图片消失

Posted

技术标签:

【中文标题】C#图片框图片消失【英文标题】:C# picture box Image dissapearing 【发布时间】: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 事件会在各种场合被系统调用,所以不要在里面放不属于那里的东西! 【参考方案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);
                        
    

【讨论】:

当我这样做时(就像我开始的那样)我得到一个白色的图像。 那么我们需要更多细节,更好地了解您的应用程序。

以上是关于C#图片框图片消失的主要内容,如果未能解决你的问题,请参考以下文章

C# 从一个图片框拖放到另一个图片框

用图片框on_click c#切换图片框的图片

解决uniapp无法显示uni-file-picker的问题 - 不显示图片选择框 - 图片上传按钮消失

C#中的图片框值

C# 图片框旋转

C# .net windows 窗体;通过图片框上传带有cloudinary的图像[重复]