Форум программистов, компьютерный форум, киберфорум
Наши страницы

C# Windows Forms

Войти
Регистрация
Восстановить пароль
 
Demonik
0 / 0 / 0
Регистрация: 10.05.2013
Сообщений: 9
#1

Файл остается заблокированным до тех пор, пока объект Image не будет ликвидирован - C#/.NET 4.x

26.07.2014, 18:42. Просмотров 293. Ответов 4
Метки нет (Все метки)

Всем доброго времени суток.

Нужна помощь.

Есть image Box в нем отображается картинка при двойном клике на imageBox открывается окно для выбора файла.

При замене файла я полностью очищаю imageBox и пытаюсь перезаписать файл с новой картинкой. но Постоянно получаю ошибку о том что якобы старый файл все еще используется. вот мой код.

в чем моя ошибка можно ли это сделать проще ?


C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
public PictureBox(System.Windows.Forms.ScrollableControl parent, string itemName, string onLabelText)
                : base(parent, onLabelText)
            {
                this.pictureBox = new System.Windows.Forms.PictureBox();
                this.pictureBox.Parent = parent;
                this.pictureBox.Name = itemName;
                this.pictureBox.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
                this.pictureBox.Size = new Size(200, 50);
                this.pictureBox.Location = new Point(spacerX, newlineInterval + LabelerCounter * spacerY);
                this.pictureBox.DoubleClick += pictureBox_DoubleClick;
                if (System.IO.File.Exists(imagePath))
                {
                    this.pictureBox.Image = Image.FromFile(imagePath);//new Bitmap(imagePath);
                }
                LabelerCounter++;
            }
            void pictureBox_DoubleClick(object sender, EventArgs e)
            {
                System.IO.Stream myStream = null;
                System.Windows.Forms.OpenFileDialog loadImage = new System.Windows.Forms.OpenFileDialog();
 
                this.pictureBox.Image = null;
                this.pictureBox.Invalidate();
 
 
                loadImage.InitialDirectory = "c:\\";
                loadImage.Filter = "JPEG Files (*.jpeg)|*.jpeg|PNG Files (*.png)|*.png|JPG Files (*.jpg)|*.jpg|GIF Files (*.gif)|*.gif";
                loadImage.FilterIndex = 2;
                loadImage.RestoreDirectory = true;
 
                if (loadImage.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    try
                    {
                        if ((myStream = loadImage.OpenFile()) != null)
                        {
                            using (myStream)
                            {
                                var logo = Image.FromFile(loadImage.FileName);
                                newLogo = ScaleImage(logo, 135, 40);
 
                                string tmpPath = imagePath.Substring(0, imagePath.Length - 4) + "_1" + imagePath.Substring(imagePath.Length - 4, 4);
                                //  System.IO.File.Copy(imagePath, tmpPath);
                                newImage.Save(imagePath, ImageFormat.Png);
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        System.Windows.Forms.MessageBox.Show(Strings.errorImage + ex.Message);
                    }
                }
            }
            public Image ScaleImage(Image image, int maxWidth, int maxHeight)
            {
                var ratioX = (double)maxWidth / image.Width;
                var ratioY = (double)maxHeight / image.Height;
                var ratio = Math.Min(ratioX, ratioY);
 
                var newWidth = (int)(image.Width * ratio);
                var newHeight = (int)(image.Height * ratio);
 
                newImage = new Bitmap(newWidth, newHeight);
                Graphics.FromImage(newImage).DrawImage(image, 0, 0, newWidth, newHeight);
                return newImage;
            }
        }
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.07.2014, 18:42
Здравствуйте! Я подобрал для вас темы с ответами на вопрос .NET 4.x Файл остается заблокированным до тех пор, пока объект Image не будет ликвидирован (C#):

Ввод цифр с клавиатуры до тех пор, пока не будет введена цифра 1 - C#
Используя оператор цикла do while, составить программу, которая будет требовать ввод цифр с клавиатуры до тех пор, пока не будет введена...

Блокировка системы приложением до тех пор, пока в него не будет введена информация - C#
Доброго времени суток! Не подскажете, возможно ли сделать так: запускается приложение, проверяется условие, после чего, в зависимости...

При воспроизведении текста программа зависает до тех пор, пока текст не закончится - C#
Встроил в программу синтезатор речи. Говорит, всё нормально, но возникли проблемы. При воспроизведении текста программа зависает до тех...

Реализовать выполнение метода в фоне до тех пор пока не нажата кнопка стоп - C#
Здравствуйте) Подскажите пожалуйста какой класс использовать для создания потока или может есть еще какой-то вариант. Нужно чтобы метод...

Выводить числа в файл до тех пор, пока не будет введен 0 - Turbo Pascal
Привет всем. Немогу разобраться и написать правильный код программы для задачи, собственно условие: Напишите программу, которая будет...

Записывать строки в файл то тех пор, пока не будет введена пустая строка - Turbo Pascal
Есть код var f:text; st:string begin assign (f,'file1.txt'); rewrite (f); repeat begin write ('введите строку для записи');...

4
НеСказочник
58 / 46 / 8
Регистрация: 12.11.2012
Сообщений: 356
Записей в блоге: 2
26.07.2014, 19:48 #2
Вот тут на MSDN написано
Файл остается заблокированным до тех пор, пока объект Image не будет ликвидирован.
. Это значит что Вы не можете просто сделать так:
C#
1
this.pictureBox.Image = null;
и радоваться жизни. Нужно закрыть предыдущий Image, а потом только открывать новый.
2
Demonik
0 / 0 / 0
Регистрация: 10.05.2013
Сообщений: 9
27.07.2014, 14:32  [ТС] #3
Можно более конкретно объяснить в смысле ликвидирован?
0
НеСказочник
58 / 46 / 8
Регистрация: 12.11.2012
Сообщений: 356
Записей в блоге: 2
27.07.2014, 16:26 #4
Image.Dispose или Image.Finalize. Файл - этол тоже ресурс.
1
Demonik
0 / 0 / 0
Регистрация: 10.05.2013
Сообщений: 9
28.07.2014, 19:16  [ТС] #5
Спасибо попробую

Добавлено через 7 часов 25 минут
Еще раз спасибо заработало не много поменял код переместил метод удаления связи с картинкой в функцию изменения размера картинки.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
 void pictureBox_DoubleClick(object sender, EventArgs e)
              {
                  System.IO.Stream myStream = null;
                  System.Windows.Forms.OpenFileDialog loadImage = new System.Windows.Forms.OpenFileDialog();
 
                  loadImage.InitialDirectory = "c:\\";
                  loadImage.Filter = "JPEG Files (*.jpeg)|*.jpeg|PNG Files (*.png)|*.png|JPG Files (*.jpg)|*.jpg|GIF Files (*.gif)|*.gif";
                  loadImage.FilterIndex = 2;
                  loadImage.RestoreDirectory = true;
 
                  if (loadImage.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                  {
                      try
                      {
                          if ((myStream = loadImage.OpenFile()) != null)
                          {
                              using (myStream)
                              {
                                  var logo = Image.FromFile(loadImage.FileName);
                                  newLogo = ScaleImage(logo, 135, 40);
 
                                  string tmpPath = imagePath.Substring(0, imagePath.Length - 4) + "_1" + imagePath.Substring(imagePath.Length - 4, 4);
                                //  System.IO.File.Copy(imagePath, tmpPath);
                                  
                                  newImage.Save(imagePath, ImageFormat.Png);
                                  this.pictureBox.Image = Image.FromFile(imagePath);
                              }
                          }
                      }
                      catch (Exception ex)
                      {
                          System.Windows.Forms.MessageBox.Show(Strings.ImageError + ex.Message);
                      }
                  }
              }
              public Image ScaleImage(Image image, int maxWidth, int maxHeight)
              {
                  var ratioX = (double)maxWidth / image.Width;
                  var ratioY = (double)maxHeight / image.Height;
                  var ratio = Math.Min(ratioX, ratioY);
                  
                  var newWidth = (int)(image.Width * ratio);
                  var newHeight = (int)(image.Height * ratio);
 
                  newImage = new Bitmap(newWidth, newHeight);
                  Graphics.FromImage(newImage).DrawImage(image, 0, 0, newWidth, newHeight);
                  this.pictureBox.Image.Dispose();
                  this.pictureBox.Invalidate();
                  return newImage;
              }
         }

Теперь все полностью рабочее. Может быть кому- то пригодится Вся проблема была в this.pictureBox.Image = null;
и в расположении метода отвечающего за удаление.
0
28.07.2014, 19:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.07.2014, 19:16
Привет! Вот еще темы с ответами:

Цикл, который будет выполняться до тех пор, пока в указанной папке не появится определённый файл - CMD/BAT
Здравствуйте. Помогите написать цикл в пакетном файле bat. Необходим цикл, который будет выполняться до тех пор, пока в указанной папке,...

Написать программу которая будет требовать пароль до тех пор пока он не будет введен верно - C#
Написать программу которая будет требовать пароль до тех пор пока он не будет введен верно.

Вводить с клавиатуры числа до тех пор пока не будет(-1) - QBasic
Вводить с клавиатуры любые целые числа до тех пор пока не будет введено число (-1). Каких чисел было введено больше, положительных или...

Запрашивать пароль до тех пор, пока он не будет правильно введен - Turbo Pascal
Составит программу , которая запрашивает пароль(например, четырехзначное число) до тех пор, пока он не будет правильно введен.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.