0

このコードを使用して、画像フォルダーの画像を3つの画像ボックスにランダムに間隔を置いて表示していますが、ARandomNumber取得System.drawing.Bitmapしているため、FileNotFoundExceptionこのパスを取得しているため取得していますpictureBox3.image C:\Users\Monika\Documents\Visual Studio 2010\Projects\OnlineExam\OnlineExam\Image\System.Drawing.Bitmap.png

どこが間違っているのかわかりません:

namespace StudentModule
{
    public partial class Form1 : Form
    {
        Random r = new Random();
        int index = -1;
        List<Image> images;
        Image ARandomNumber;
        Timer timer = new Timer();
        private int counter = 0; 
        public Form1()
        {
            InitializeComponent();
            timer1.Interval = 350;
            timer1.Tick += new EventHandler(timer1_Tick);

            List<Image> images = new List<Image>();//add images to this array
            DirectoryInfo di = new DirectoryInfo(@"C:\Users\Monika\Documents\Visual Studio 2010\Projects\OnlineExam\OnlineExam\Image"); // give path
            FileInfo[] finfos = di.GetFiles("*.jpg", SearchOption.TopDirectoryOnly);
            foreach (FileInfo fi in finfos)
                images.Add(Image.FromFile(fi.FullName));
            index++;
            if (index < 0 || index >= images.Count)
                index = 0;
            timer.Start();
            pictureBox1.Visible = false;
            pictureBox2.Visible = false;
            pictureBox3.Visible = false;
            pictureBox4.Visible = false;


            int indx = r.Next(0, images.Count - 1);

            ARandomNumber = images[index];
            images.RemoveAt(indx);

            string path = @"C:\Users\Monika\Documents\Visual Studio 2010\Projects\OnlineExam\OnlineExam\Image\";
            pictureBox3.Image = Image.FromFile(path + ARandomNumber + ".png");
            indx = r.Next(0, images.Count - 1);

            ARandomNumber = images[index];
            images.RemoveAt(index);
            pictureBox4.Image = Image.FromFile(path + ARandomNumber + ".png");
            indx = r.Next(0, images.Count - 1);
            ARandomNumber = images[index];
            images.RemoveAt(index);
            pictureBox5.Image = Image.FromFile(path + ARandomNumber + ".png");
            //Console.WriteLine(ARandomNumber);
            if (images.Count <= 1)
            {
                images.Clear();
                populateImag();
            }
        }
        public void timer1_Tick(object sender, EventArgs e)    
        {
           counter++;
           if (counter == 1) 
            //or whatever amount of time you want it to be invisible            
        {
            pictureBox3.Visible = true;

        }
        if (counter == 2)
        {
            pictureBox4.Visible = true;
        }
        if (counter == 3)
        {
            pictureBox5.Visible = true;
            timer.Stop();
            counter = 0;
        }                     
       }
        public void populateImag()
        {
            List<Image> images = new List<Image>();//add images to this array
            DirectoryInfo di = new DirectoryInfo(@"C:\Users\Monika\Documents\Visual Studio 2010\Projects\OnlineExam\OnlineExam\Image"); // give path
            FileInfo[] finfos = di.GetFiles("*.jpg", SearchOption.TopDirectoryOnly);
            foreach (FileInfo fi in finfos)
                images.Add(Image.FromFile(fi.FullName));
        }
    }
}

助けてくれてありがとう。

4

3 に答える 3

2

ARandomNumber は画像であり、パスではありません。イメージはメモリにロードされるリソースであり、常にパスにリンクされているわけではありません。

ARandomNumber.ToString() はパスを返さないため、これは機能しません ( ARandomNumber の代わりにファイルパスを含む文字列として使用することをお勧めします)。

pictureBox3.Image = Image.FromFile(path + ARandomNumber + ".png");

次に、最初にすべての *.jpg をロードします。

FileInfo[] finfos = di.GetFiles("*.jpg", SearchOption.TopDirectoryOnly);

次に、拡張子が *.png の画像を読み込みます。

pictureBox3.Image = Image.FromFile(path + ARandomNumber + ".png");

フォルダに同じ名前の jpg と png の両方の画像がありますか?

編集:可能な解決策は、画像をロードする代わりにファイルパスを文字列としてロードすることですOR(すべての画像が配列にあるため)、これを試してください:

ARandomNumber = images[index]; //Here you take a random image from the array of images
images.RemoveAt(indx);

pictureBox3.Image = ARandomNumber; //Here you assign the image directly to the Image property in picturebox. You do not need to load it again from file.
于 2013-07-29T12:21:36.897 に答える
0

画像ファイルの選択中に「.jpg」画像を選択し、ロード中にこれらのファイルに「.png」拡張子を付けます。これが問題を引き起こしていると思います。エラーを見てください:

pictureBox3.image C:\Users\Monika\Documents\Visual Studio 2010\Projects\OnlineExam\OnlineExam\Image\System.Drawing.Bitmap.png

2 つの拡張子を持つファイル名。.Bitmap.png

于 2013-07-29T12:23:01.653 に答える
0

デザイナーにタイマーを追加し、間隔を設定し、デザイナーで Tick イベントをサブスクライブします。これにより、コードがよりクリーンになります。次に、ランダムな画像を表示するために使用する画像ボックスのリストを作成します。

public partial class Form1 : Form
{
    Random random = new Random();
    List<string> filesToShow = new List<string>();
    List<PictureBox> pictureBoxes;

    public Form1()
    {
        InitializeComponent();

        pictureBoxes = new List<PictureBox> {
            pictureBox1,
            pictureBox2,
            pictureBox3
        };

        ShowRandomImages();
        timer1.Start();
   }
}

コンストラクターから呼び出される唯一のメソッドは、ShowRandomImagesここでその定義です。

private void ShowRandomImages()
{
    foreach (var pictureBox in pictureBoxes)
    {
        if (!filesToShow.Any())
            filesToShow = GetFilesToShow();

        int index = random.Next(0, filesToShow.Count);
        string fileToShow = filesToShow[index];
        pictureBox.ImageLocation = fileToShow;
        filesToShow.RemoveAt(index);
    }
}

このメソッドは、場所からランダムに画像を割り当てます。表示するファイルが残っていない場合は、リストが再ロードされます。覚えておいてください - ファイル名だけが必要な場合は、Directory代わりにDirectoryInfoandを使用してFileInfoください:

private List<string> GetFilesToShow()
{
    string path = @"C:\some\folder";
    return Directory.GetFiles(path, "*.jpg", SearchOption.TopDirectoryOnly)
                    .ToList();
}

必要なのはShowRandomImages、タイマー ティック イベント ハンドラーからメソッドを呼び出すことだけです。

于 2013-07-29T12:43:00.230 に答える