0

我正在尝试创建一个在应用程序上显示小 3 个图像的 GUI。当文件夹中有新图像时,新图像必须位于 imageBoxes 的右侧。为此,我使用计时器来调用 Load_Form 函数。间隔为 1000 毫秒。但是过了一段时间(大约 3:20 分钟),程序会给出异常“内存不足”或“参数无效”。是否有另一种自动更新图像框的方法(当有新图像时,更新它)?代码在这里,提前谢谢你:

  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.Drawing.Drawing2D;
  using System.Timers;

 namespace test1
 {
    public partial class Form1 : Form
       {
        string actCode = null;
        string pathLogNames = @"D:\LOG\Right";
        string[] imPaths;

    public Form1()
    {
        InitializeComponent();
        //timer1.Start();
    }

    private void pictureBox1_Click(object sender, EventArgs e)
    {

    }
    string[] getFiles(string path, string text, string fileExtension)
    {
        try
        {
            string searchingText = text;
            searchingText = "*" + text + "*";
            string[] filesArray = Directory.GetFiles(path, searchingText, SearchOption.AllDirectories);
            List<string> filesList = new List<string>(filesArray);
            List<string> newFilesList = new List<string>();
            foreach (string file in filesList)
            {
                if (file.Contains(fileExtension) == true)
                {
                    newFilesList.Add(file);
                }
            }
            string[] files = newFilesList.ToArray();
            return files;
        }
        catch
        {
            string[] files = new string[0];
            return files;
        }

    }

  

    string[] viewerPaths;
    int pathsNumber;
    Image actImage;
    Image actImage1;
    Image actImage2;
    //int actIndex;
    double imageDefaultZoom;
    public bool mouseFlag = false;
    //Point startPoint = new Point();

    public void setPaths(string[] paths, double defZoom)
    {
        viewerPaths = paths;
        pathsNumber = viewerPaths.Length;
        imageDefaultZoom = defZoom;
        int total = viewerPaths.Length;
        if (pathsNumber > 0)
        {
            actImage = Image.FromFile(viewerPaths[total - 3]);
            Bitmap b = new Bitmap(actImage);
            Image i = resizeImage(b, new Size(100, 100));
            pictureBox1.Image = i;

            actImage1 = Image.FromFile(viewerPaths[total - 2]);
            Bitmap b1 = new Bitmap(actImage1);
            Image i1 = resizeImage(b1, new Size(100, 100));
            pictureBox2.Image = i1;

            actImage2 = Image.FromFile(viewerPaths[total - 1]);
            Bitmap b2 = new Bitmap(actImage2);
            Image i2 = resizeImage(b2, new Size(100, 100));
            pictureBox3.Image = i2;
        }
    }

    private static System.Drawing.Image resizeImage(System.Drawing.Image imgToResize, Size size)
    {
        //Get the image current width  
        int sourceWidth = imgToResize.Width;
        //Get the image current height  
        int sourceHeight = imgToResize.Height;
        float nPercent = 0;
        float nPercentW = 0;
        float nPercentH = 0;
        //Calulate  width with new desired size  
        nPercentW = ((float)size.Width / (float)sourceWidth);
        //Calculate height with new desired size  
        nPercentH = ((float)size.Height / (float)sourceHeight);
        if (nPercentH < nPercentW)
            nPercent = nPercentH;
        else
            nPercent = nPercentW;
        //New Width  
        int destWidth = (int)(sourceWidth * nPercent);
        //New Height  
        int destHeight = (int)(sourceHeight * nPercent);
        Bitmap b = new Bitmap(destWidth, destHeight);
        Graphics g = Graphics.FromImage((System.Drawing.Image)b);
        g.InterpolationMode = InterpolationMode.HighQualityBicubic;
        // Draw image with new width and height  
        g.DrawImage(imgToResize, 0, 0, destWidth, destHeight);
        g.Dispose();
        return (System.Drawing.Image)b;
    }
    private void onChanged(object sender, FileSystemEventArgs e)
    {
        //Dispose();
        imPaths = getFiles(pathLogNames, actCode, ".tif");
        setPaths(imPaths, 0.5);
    }
    private void Form1_Load(object sender, EventArgs e)
    {
        
        imPaths = getFiles(pathLogNames, actCode, ".tif");
        setPaths(imPaths, 0.5);
        
        }
    }
 }


}
4

0 回答 0