C # Недостаточно памяти при попытке изменить изображение в графическом окне - PullRequest
0 голосов
/ 06 июля 2018

Я работал с C #, разрабатывая программу для создания слайд-шоу для телевизоров в стиле домашней рекламы и т. Д.

По сути, у меня есть форма, которая первоначально переносит значения в сетевую папку с несколькими jpg, затем запускает функцию установки, чтобы получить файлы из пути к каталогу, затем запускает 2 таймера. 1 таймер - это таймер поворота изображения. а другой - таймер обновления, чтобы проверить, не изменились ли файлы в папке.

Все, что он пытался установить для изображения изображения в моей функции таймера поворота, он выбрасывает исключение «недостаточно памяти» (при первом «тике»).

Я исследовал столько, сколько смогу, я немного растерялся из-за того, что у него не хватает памяти, у моей машины достаточно физической памяти, и программа даже не кажется мне тяжелой.

Любое направление будет ценно.

Код ниже.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Collections;

namespace MarketingImagesSS
{
    public partial class Slideshow : Form
    {
        public Menu frmMenu { get; set; }

        int counter = 0;
        string[] images;
        Image image;
        public Slideshow()
        {
            InitializeComponent();
        }

        private void tmrUpdate_Tick(object sender, EventArgs e)
        {

        }

        private void tmrRotate_Tick(object sender, EventArgs e)
        {
            pxbxImages.Image.Dispose();
            image = Image.FromFile(images[counter]);
        }

        private void setup(string directory)
        {
            images = Directory.GetFiles(directory);
            image = Image.FromFile(images[counter]);
            pxbxImages.Image = image;
            counter++;
        }

        public void Slideshow_Load(object sender, EventArgs e)
        {
            string directoryPath = frmMenu.fPath;
            setup(directoryPath);
            //tmrUpdate.Start();
            tmrRotate.Start();
        }

        private void pxbxImages_DoubleClick(object sender, EventArgs e)
        {
            Close();
        }
    }

1 Ответ

0 голосов
/ 06 июля 2018

Вы можете добавить следующий метод:

     bool IsValidImg(string filename)
    {
        try
        {
            using (Image newImg = Image.FromFile(filename))
            { }
        }
        catch (OutOfMemoryException ex)
        {
            return false;
        }
        return true;
    }

затем в вашем коде добавьте это условие (если image.fromfile работает нормально или нет):

     private void tmrRotate_Tick(object sender, EventArgs e)
    {
        if (IsValidImg(images[counter])) <--- img exist condition
             image = Image.FromFile(images[counter]);    

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

       if (IsValidImage(images[counter]) &&  images.Length<=counter)
...