`
新颖666666
  • 浏览: 31268 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
社区版块
存档分类
最新评论

C# 中 PictureBox 加载图片后无法删除解决方法 .

 
阅读更多

PictureBox加载图片后,再将Image属性值设置为null,但本地图片仍无法删除,提示文件正被另一个程序使用,相关代码:

复制内容到剪贴板程序代码
//显示图片
private void button1_Click(object sender, EventArgs e)
{
    pictureBox1.Image = Image.FromFile(@"f:\demo.gif");
}

//不显示图片
private void button2_Click(object sender, EventArgs e)
{
    pictureBox1.Image = null;
}

究其原因应是Image属性值设置为null,但资源仍未释放,需等垃圾回收器回收,那我们就手动释放资源再测试下:

复制内容到剪贴板程序代码
//显示图片
private void button1_Click(object sender, EventArgs e)
{
    pictureBox1.Image = Image.FromFile(@"f:\demo.gif");
}

//不显示图片并释放资源
private void button2_Click(object sender, EventArgs e)
{
    Image image = pictureBox1.Image;
    pictureBox1.Image = null;
    image.Dispose();
}

终于可以删除了!但如果图片在使用中时试图删除图片,上边代码又不行了,解决方法是将本地图片读到内存流(相当于复制一份图片),再将内存流转化为Image对象并绑定到PictureBox的Image属性,这样原图可正常删除,代码如下:

复制内容到剪贴板程序代码
//显示图片
private void button1_Click(object sender, EventArgs e)
{
    pictureBox1.Image = GetFile(@"f:\demo.gif");
}

//不显示并释放资源
private void button2_Click(object sender, EventArgs e)
{
    Image image = pictureBox1.Image;
    pictureBox1.Image = null;
    image.Dispose();
}

///
/// 将文件转为内存流
///
///
///
private MemoryStream ReadFile(string path)
{
    if (!File.Exists(path))
        return null;

    using (FileStream file = new FileStream(path, FileMode.Open))
    {
        byte[] b = new byte[file.Length];
        file.Read(b, 0, b.Length);

        MemoryStream stream = new MemoryStream(b);
        return stream;
    }
}

///
/// 将内存流转为图片
///
///
///
private Image GetFile(string path)
{
    MemoryStream stream = ReadFile(path);
    return stream == null ? null : Image.FromStream(stream);
}
分享到:
评论

相关推荐

    c#在pictureBox控件上绘制矩形框,鼠标点击可拖拽,伸缩

    winform在pictureBox控件上绘制矩形框,鼠标点击可拖拽,伸缩

    清除picturebox上已绘制的线

    思路:说是清除,实际上是用背景色做了一下覆盖 在winform上添加一个picturebox1,绘制一条线,然后拖动鼠标,再绘制一个矩形,并填充背景色

    C# for CSDN 乱七八糟的看不懂

    第6页 C#(WINFORM)学习 找到集合中数量最多的一个元素 利用方法来查找,可以返回两个变量。 object Jmax0(ArrayList v11,ref int jj) { int i; object j0=0; ArrayList y11=new ArrayList(); //各个不同的元素的...

    c# 加密和解密相关代码

    序中判断是否为数字的方法有很多种,可以使用正则表达式、int.Parse 方法和double.Parse 方法等。下面的代码 通过double.Parse 方法判断textBox1 文本框中的输入是否为数字。 double.Parse(textBox1.Text); 实例573 ...

    C#编程经验技巧宝典

    74 <br>0107 如何获得字符串中数字或字母的长度 74 <br>0108 如何获得字符串中某个数字的位置 75 <br>0109 获得字符串中汉字的个数 76 <br>0110 获得字符串中指定后几位字符 76 <br>0111 ...

    C# 实现多个IP摄像头画面预览以及截图

    1、C# 多个ip摄像头画面预览以及截图界面 2、winform VS2013 .NET4 Client Profile 3、测试摄像头:海康威视 亲测有效哦,绝对物超所值! ...预览、抓图、客户端录像基本功能...5、IP通道设置(添加、修改、删除)功能。

    C#曲线编辑器开发核心功能演示代码工程

    1、使用Winform中PictureBox控件自制C#曲线面板显示数据曲线。 2、在曲线上进行关键帧数据添加操作 3、在曲线上进行关键帧数据删除操作 4、关键帧数据得数值编辑、修改操作 5、对关键帧数据进行插值计算得到曲线数据...

Global site tag (gtag.js) - Google Analytics