覆盖BMP文件,无法删除,因为它被其他进程使用 - 处理,使用不工作

时间:2016-09-01 06:52:41

标签: c# winforms file bitmap

这就是这个简单程序的全部内容。有一个按钮,你打开一个图像文件,程序对它进行水印并覆盖它:

private void button1_Click(object sender, EventArgs e)
    {
        var openDialog = new OpenFileDialog();
        var dialogResult = openDialog.ShowDialog();

        if (dialogResult == DialogResult.OK)
        {
            var file = openDialog.FileName;

            using (var bmp = new Bitmap((Bitmap)Image.FromFile(file)))
            using (var g = Graphics.FromImage(bmp))
            {
                openDialog.Dispose();

                var waterSign = (Bitmap)Properties.Resources.ResourceManager.GetObject("watersign");

                var margin = 15;
                var x = bmp.Width - waterSign.Width - margin;
                var y = bmp.Height - waterSign.Height - margin;

                g.DrawImage(waterSign, new Point(x, y));

                waterSign.Dispose();
            }

            try
            {
                File.Delete(file);
                //bmp2.Save("C:\\Temp\\huhu.bmp");
                this.Dispose();
            }

            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }

现在我只是想删除该死的文件,因为某些原因它无法正常工作。我尝试使用你可以看到的,以及Dispose(),以及创建另一个从第一个获取数据的BMP。

有什么想法吗?提前谢谢!

1 个答案:

答案 0 :(得分:1)

< p>< / p>行 < pre>< code> using(var bmp = new Bitmap((Bitmap)Image.FromFile(file))) < /代码>< /预> < p>从文件中加载位图,然后创建< a href =“https://stackoverflow.com/questions/12709360/whats-the-difference-between-bitmap-clone-and-new-bitmapbitmap” >独立副本< / a>使用< a href =“https://msdn.microsoft.com/en-us/library/ts25csc8(v=vs.110).aspx"rel =”nofollow“>< code> Bitmap(图像)LT /代码>< / A>构造函数。退出< code>时使用< / code>声明副本将被释放 - 但不是从文件加载的内部位图。直到内部位图最终由GC完成,它将保持对文件的锁定,如< a href =“https://msdn.microsoft.com/en-us/library/stf701f5(v=vs)中所述。 .110).aspx“rel =”nofollow“> docs< / a>:< / p> < BLOCKQUOTE>   < p>文件保持锁定状态,直到放置图像为止。< / p> < / BLOCKQUOTE> < p>这可以防止您立即删除文件。< / p> < p>假设您实际上是在尝试修改文件中的图像并将其保存回原始位置,您可以执行以下操作:< / p> < pre>< code> Bitmap bmp = null; 尝试 {     使用(var bmpFromFile =(Bitmap)Image.FromFile(file))     {         bmp = new Bitmap(bmpFromFile);     }     使用(var g = Graphics.FromImage(bmp))     {         //对bmp进行更改     }     //将bmp保存到临时文件。     //删除原始文件并将临时文件移动到该名称。 } 最后 {     //处理bmp     使用(bmp){} } < /代码>< /预> < p>或者,将文件加载到中间< code> MemoryStream< / code>然后按照建议的方式从内存流中创建位图< a href =“https://stackoverflow.com/questions/4803935/free-file-locked-by-new-bitmapfilepath/14837330#14837330”> here< / a&gt ;。< / p为H.