IOException было необработанным - PullRequest
0 голосов
/ 12 февраля 2012

У меня есть приложение, которое обрезает изображение и сохраняет его
процесс состоял в том, чтобы загрузить изображение, обрезать его, удалить исходное изображение (чтобы я мог заменить его) и сохранить его.
это мой код:

private void DetectSize(object sender, EventArgs e)  
{  
int x = 1;  
Bitmap TempImage = new Bitmap(@cwd + "\\t" + (x + 1) + ".jpg", true);  
        pictureBox.Image = (Image)TempImage.Clone();  
        TempImage.Dispose();  
        Bitmap imgPart = new Bitmap(pictureBox.Image);  
        int imgHeight = imgPart.Height;  
        int imgWidth = imgPart.Width;  
        HalfWidth = imgWidth / 2;  
        MaxWidth = imgWidth;  
        try  
        {  
            Bitmap imgPart1 = new Bitmap(pictureBox.Image);  
            Color c;  
            for (int i = 0; i < imgPart1.Width; i++)  
            {  
                for (int j = 0; j < imgPart1.Height; j++)  
                {  
                    c = imgPart1.GetPixel(i, j);  
                    string cn = c.Name;  
                    for (int z = 0; z <= 9; z++)  
                    {  
                        if (z < 10)  
                        {  
                            if (cn == "ff00000" + z)  
                            {  
                                if (i < HalfWidth)  
                                {  
                                    MinWidth = i;  
                                }  
                                else  
                                {  
                                    if (i < MaxWidth)  
                                    {  
                                        MaxWidth = i;  
                                    }  
                                }  
                            }  
                        }  
                        else  
                        {  
                            if (cn == "ff0000" + z)   
                            {  
                                if (i < HalfWidth)  
                                {  
                                    MinWidth = i;  
                                }  
                                else  
                                {    
                                    if (i < MaxWidth)  
                                    {  
                                        MaxWidth = i;  
                                    }  
                                }  
                            }  
                        } 
                    }  
                }  
            }  
            MinWidth += 1;  
            MaxWidth -= 1;  
            MaxWidth = imgWidth - MaxWidth;  
            imgPart1.Dispose();  
            imgPart.Dispose();  
            lblLeftMargin.Text = Convert.ToString(MinWidth);  
            lblRightMargin.Text = Convert.ToString(MaxWidth);  

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

Это для определения полей, которые будут использоваться для обрезки изображения.

private void CropSave(object sender, EventArgs e)
    {
        int x = 1;
        Bitmap croppedBitmap = new Bitmap(pictureBox.Image);

        croppedBitmap = croppedBitmap.Clone(
        new Rectangle(
            MinWidth, 0,
            (int)croppedBitmap.Width - MinWidth - MaxWidth,
            1323),
        System.Drawing.Imaging.PixelFormat.DontCare);

        if (System.IO.File.Exists(@cwd + "\\t" + (x + 1) + ".jpg"))
            System.IO.File.Delete(@cwd + "\\t" + (x + 1) + ".jpg");

        croppedBitmap.Save(@cwd + "\\t" + (x + 1) + ".jpg", System.Drawing.Imaging.ImageFormat.Jpeg);

        croppedBitmap.Dispose();
        MessageBox.Show("File " + (x + 1) + "Done Cropping");
    }  

и это для обрезки и сохранения изображения

Ошибка отображается в строке System.IO.File.Delete(@cwd + "\\t" + (x + 1) + ".jpg"

сказано

Процесс не может получить доступ к файлу 'C: \ Users .... \ t2.jpg', поскольку он используется другим процессом.

Я пытаюсь посмотреть, где я был не прав в течение нескольких дней, и все еще ничего.
Пожалуйста, помогите мне.

1 Ответ

4 голосов
/ 12 февраля 2012
    Bitmap TempImage = new Bitmap(@cwd + "\\t" + (x + 1) + ".jpg", true);  
    pictureBox.Image = (Image)TempImage.Clone();  
    TempImage.Dispose();  

Метод Clone () не делает то, на что вы надеетесь. Он по-прежнему сохраняет блокировку файла, объект сопоставленного файла памяти распределяется между двумя объектами изображения. Удаление первого из них просто закрывает один дескриптор на объекте, объект pictureBox.Image все еще имеет открытый второй дескриптор. Напишите это так:

    pictureBox.Image = new Bitmap(TempImage); 
...