Программа измерения расстояния до формы Windows работает после открытия нескольких изображений - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть программа, которая позволяет пользователю открывать изображение и измерять его, перетаскивая на него мышь.Изображение открывается в графическом окне при нажатии кнопки.Программа работает после открытия двух изображений, но не после открытия трех изображений.После третьего изображения измерения сильно преувеличены.Вот часть моего кода, которая открывает изображение:

private void openPlan_Click(object sender, EventArgs e)// open plan folder
    {
        pictureBox1.Image = null;

        // open file dialog   
        OpenFileDialog open = new OpenFileDialog();
        open.InitialDirectory = @"C:\Users\Admin\Documents\complete Lumber Estimation Tool\Plans\";
        // image filters  
        if (open.ShowDialog() == DialogResult.OK)
        {

            trackBar1.Value = 4;
            zoom = 1.0F;
            imgOriginal = null;
            // display image in picture box  
            imgOriginal = new Bitmap(open.FileName);

            pictureBox1.Image = imgOriginal;
       }
  }

Это в основном проблема с тем, как программа Windows Form хранит данные?Если так, как я могу убедиться, что программа не использует данные или параметры из предыдущего изображения?

1 Ответ

0 голосов
/ 12 сентября 2018

Как и в моем комментарии:
Всегда dispose изображения, особенно с открытыми файловыми дескрипторами. Использование:

imgOriginal?.Dispose();  
pictureBox1.Image?.Dispose(); 

вместо: .Image = null

... более подробно:
Класс Image использует GDI, что заставляет открывать дескрипторы. Эти дескрипторы не закрываются автоматически, просто теряя ссылку в вашем приложении. Они не собираются сборщиком мусора (docs.microsoft.com Garbrage-Collection) .

Это может привести к непредсказуемому поведению вашего приложения или за его пределами.
Например: если вы загружаете изображение из файла, открытый дескриптор приводит к filelock (!) также, если вы просто нажимаете для отображения изображения. Для этого случая вы можете загрузить все изображение в промежуточный объект System.IO.MemoryStream. Инкапсулируйте изображение из оригинального источника следующим образом:

var stream = new System.IO.MemoryStream(System.IO.File.ReadAllBytes(filepath));
var Image = Image.FromStream(stream);

Это загрузит файл в память и изображение из него. Утилизируйте поток и изображение после использования или при загрузке другого изображения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...