Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Demonik
0 / 0 / 0
Регистрация: 10.05.2013
Сообщений: 9
#1

Файл остается заблокированным до тех пор, пока объект Image не будет ликвидирован

26.07.2014, 18:42. Просмотров 309. Ответов 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
Ответы с готовыми решениями:

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

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

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

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

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

4
НеСказочник
58 / 46 / 13
Регистрация: 12.11.2012
Сообщений: 365
Записей в блоге: 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 / 13
Регистрация: 12.11.2012
Сообщений: 365
Записей в блоге: 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

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

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

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


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

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

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