如何删除c#中打开的图片框的图像

时间:2014-06-21 08:21:29

标签: c#

我有一个图片框。 它从webcam.i获取图像想要从目录中删除它的图片并保存它的新图片。但是在“File.Delete(Application.S ...”中的句子中说这个错误:

 The process cannot access the file '...\bin\Debug\dataBase\img\6.jpg' because it is being used by another process.

鳕鱼:

                  Bitmap bmp1 = new Bitmap(_pic_image.Image);


                    string path = Application.StartupPath + @"\dataBase\img\" + _txt_sufix.Text + ".jpg";
                    CheckIfFileIsBeingUsed(path);
                    if (System.IO.File.Exists(path))
                        System.IO.File.Delete(path);

                    bmp1.Save(path, System.Drawing.Imaging.ImageFormat.Jpeg);
                    //_pic_image.Visible = true;
                    _pic_image.Image = bmp1;
                    _pic_image.Visible = true;
                    // Dispose of the image files.
                    bmp1.Dispose();


 public bool CheckIfFileIsBeingUsed(string fileName)
    {

        try
        {
            File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.None);
        }

        catch (Exception exp)
        {

            return true;
        }

        return false;

    }

1 个答案:

答案 0 :(得分:-1)

您可以使用以下功能加载图像而不锁定它。加载位图后,您可以毫无问题地删除它。
用法:

_pic_image.Image = OpenImageWithoutLockingIt("h:\myimage.png")


功能:

    Private Function OpenImageWithoutLockingIt(imagePath As String) As Bitmap
    If IO.File.Exists(imagePath) = False Then Return Nothing
    Using imfTemp As Image = Image.FromFile(imagePath)
        Dim MemImage As Bitmap = New Bitmap(imfTemp.Width, imfTemp.Height)
        Using g As Graphics = Graphics.FromImage(MemImage)
            g.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
            g.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
            g.PixelOffsetMode = Drawing2D.PixelOffsetMode.HighQuality
            g.CompositingQuality = Drawing2D.CompositingQuality.HighQuality
            g.Clear(Color.Transparent)
            g.DrawImage(imfTemp, 0, 0, MemImage.Width, MemImage.Height)
            Return MemImage
        End Using
    End Using
End Function

您还可以使用以下功能删除只读文件:

    Private Function DeleteImageFile(filePath As String, DeleteAlsoReadonlyFile As Boolean) As Boolean
    Try

        If IO.File.Exists(filePath) = False Then Return True
        If DeleteAlsoReadonlyFile Then
            Dim fileInf As New FileInfo(filePath)
            If fileInf.IsReadOnly Then
                'remove readonly attribute, otherwise File.Delete throws access violation exception.
                fileInf.IsReadOnly = False
            End If
        End If
        IO.File.Delete(filePath)
        Return True
    Catch ex As Exception
        Return False
    End Try
End Function

C#代码:

   private Bitmap OpenImageWithoutLockingIt(string imagePath)
    {
        if (System.IO.File.Exists(imagePath) == false)
            return null;
        using (Image imfTemp = Image.FromFile(imagePath))
        {
            Bitmap MemImage = new Bitmap(imfTemp.Width, imfTemp.Height);
            using (Graphics g = Graphics.FromImage(MemImage))
            {
                g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
                g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
                g.Clear(Color.Transparent);
                g.DrawImage(imfTemp, 0, 0, MemImage.Width, MemImage.Height);
                return MemImage;
            }
        }
    }

    private bool DeleteImageFile(string filePath, bool DeleteAlsoReadonlyFile)
    {
        try
        {
            if (System.IO.File.Exists(filePath) == false)
                return true;
            if (DeleteAlsoReadonlyFile)
            {
                FileInfo fileInf = new FileInfo(filePath);
                if (fileInf.IsReadOnly)
                {
                    //remove readonly attribute, otherwise File.Delete throws access violation exception.
                    fileInf.IsReadOnly = false;
                }
            }
            System.IO.File.Delete(filePath);
            return true;
        }
        catch (Exception ex)
        {
            return false;
        }
    }