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
中设置断点。
规则是,对于持久结果,您应该仅使用Paint
event 及其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#图片框图片消失的主要内容,如果未能解决你的问题,请参考以下文章