C#随机地一个接一个地显示图像

时间:2011-01-10 10:22:02

标签: c# picturebox

我正在创建一个简单的基于表单的消息显示系统,每个消息都是一个jpeg图像,我想要实现的是当程序加载时(就在用户登录后),其中一个jpg是随机选择并显示的,如果用户单击“下一步”按钮,则会显示另一个jpg,直到显示完所有jpg。我想我需要将每个图像读入一个数组,然后从数组中随机选择一个,然后当用户单击Next时,移动到数组中的下一个项目。一个警告是我不希望程序锁定打开jpg文件,因为其他人需要能够删除它们。

我目前的代码如下,我将不胜感激您提供任何帮助和建议。

private void Form1_Load(object sender, EventArgs e)
 {
      var rand = new Random();
      var files = Directory.GetFiles(@"\\server\screens\", "*.jpg");
      pictureBox1.Image = System.Drawing.Bitmap.FromFile(files[rand.Next(files.Length)]);  
 }

private void buttonNextImage_Click(object sender, EventArgs e)
 {
      var rand = new Random();
      var files = Directory.GetFiles(@"\\server\screens\", "*.jpg");
      pictureBox1.Image = System.Drawing.Bitmap.FromFile(files[rand.Next(files.Length)]);
 }

非常感谢 史蒂芬

7 个答案:

答案 0 :(得分:3)

请勿使用Bitmap.FromFile,请使用Bitmap.FromStream

using(var fs = new FileStream(files[rand.Next(files.Length),
                              FileMode.Open, FileAccess.Read))
{
    pictureBox1.Image = System.Drawing.Bitmap.FromStream(fs);
}
  

我不知道如何创建图像数组

var files = Directory.GetFiles("\\\\server\\screens\\", "*.jpg");
var images = new Image[files.Length];
for(int i = 0; i < files.Length; ++i)
{
    using(var fs = new FileStream(files[i], FileMode.Open, FileAccess.Read))
    {
        images[i] = System.Drawing.Image.FromStream(fs);
    }
}

答案 1 :(得分:2)

这里有两件事:

  1. 将您的随机实例移出到类成员,这样它只会被实例化一次。
  2. 显示图像后,将其从文件阵列中删除,以便只有未显示的图像保留在列表中。当列表为空时,您知道已全部显示它们。

答案 2 :(得分:0)

扩展ØyvindBråthen的答案,你可以在显示所有图片后重置阵列,也可以使用计时器,每次经常自动更改图像?

答案 3 :(得分:0)

我相信你有两个选择:

a)您将JPG文件加载到内存流中(最差的选项)。

b)您创建具有相同名称和后缀的临时文件,如“tmp”(即“1.tmp.jpg”)。

在创建副本后直接选择“b”,您可以在类级别中随机显示那些要显示的文件的索引。

之后,使用某种计时器,以便在每次打勾后更改图像。

最后,每次打勾后,您都可以同步该文件路径数组,让您的程序显示最新的和最新的。

这是我的建议:)

答案 4 :(得分:0)

提示列表:

  • 不要制作一系列图片;制作您已经展示过的HashSet<string>个文件名。然后,当单击 NEXT 时,再次遍历该文件夹并忽略您已经显示的文件名。从剩下的(如果有的话)中随机选择一个。这样,即使文件夹内容在运行时发生变化,您仍然可以充分利用它。并且您不会通过一次加载所有图像来浪费内存。
  • 在显示图片的时候,像你一样加载,然后Clone(),然后Dispose()原始图片。这样它就不会锁定文件。
  • 在显示下一张图片时,请不要忘记Dispose()上一张图片以释放资源。

答案 5 :(得分:0)

以下是了解您的请求的一般方法。

  1. 将所选目录中的所有jpeg文件(从您的样本\\Server\Screens\)加载到数组中。

  2. 随机化文件数组。以下是对数组进行混洗的示例实现:Most efficient way to randomly shuffle a list of integers

  3. 将第一张图片加载到数组中。该数组显然包含文件名,因此您不能只将PictureBox的Image属性指向所需的元素;你必须加载图像。

    由于您不想锁定图像,建议从流中加载图像(请参阅@max's answer)。

  4. 当用户点击下一个按钮时,请加载下一张图片。从问题开始,您必须检查文件是否存在,我推断用户可能会在文件加载之前将其删除。

答案 6 :(得分:0)

public static int id = 0;
private void timer1_Tick(object sender, EventArgs e)
{
    id = id + 1;
    filelocation = "E:\\example\\" + id + ".bmp";
    pictureBox1.Image = System.Drawing.Bitmap.FromFile(filelocation);
}