按钮点击从资源随机播放图片

时间:2012-07-03 22:51:40

标签: c# image random picturebox shuffle

我有一个名为studPic的图片框。我想要的是,当我点击“随机播放”按钮时,从资源中获取随机图像。

private void button2_Click(object sender, EventArgs e)
        {
...     
        }

经过研究,我发现了以下

http://social.msdn.microsoft.com/Forums/en-US/Vsexpressvcs/thread/38d36fa4-1f5f-43e9-80f6-3c9a4edc7705/

我是C#的新手..有没有更简单的方法来实现这个结果?例如,没有添加图片名称?

更新

List<string> pictureNames = new List<string>();
pictureNames.Add("1");
pictureNames.Add("2");
pictureNames.Add("3");
int randomPictureIndex = new Random().Next(0, pictureNames.Count);
string randomPictureName = pictureNames[randomPictureIndex];
pictureNames.Remove(randomPictureName);
Image img = Properties.Resources.randomPictureName; //erroor
studPic.Image = img;

收到错误消息 错误1'Properties.Resources'不包含'randomPictureName'的定义

3 个答案:

答案 0 :(得分:3)

我不会为此使用系统资源。它们不像断开连接软件的文件系统那样可维护。

将您的图片放在应用的文件夹中。通过这种方式,可以轻松更新/更改它们。 说:

C:\Ninjas - app
c:\Ninjas\images - images

创建一个包含这些图像的数组。

string[] files = System.IO.Directory.GetFiles("c:\ninjas\images");

您需要在GetFiles上放置一些过滤器,以确保您只能获得图片。

现在抓住该数组中的一个随机位置(你已经显示你知道如何做随机数)。

我们有阵列,让它随机播放然后你可以顺序完成它们(比随机选择更快.CPU会爱你吧)

    private string[] files;
    private int currentIndex = 0;

    private void initializeImages()
    {
        //Grab directories in your images directory
        string appRoot = System.IO.Path.GetDirectoryName(Application.ExecutablePath);
        files = System.IO.Directory.GetFiles(appRoot + @"\images");
        Random rnd = new Random();
        files = files.OrderBy(x => rnd.Next()).ToArray();
    }


    private void setImage()
    {
        pictureBox1.ImageLocation = files[currentIndex];
    }

    private void previousImage()
    {
        currentIndex = currentIndex > 0 ? currentIndex - 1 : 0;
        setImage();
    }

    private void nextImage()
    {
        currentIndex = currentIndex < files.Length - 1 ? currentIndex + 1 : files.Length - 1;
        setImage();
    }

一些事情:

  • 不要硬编码文件路径。在app.config文件中有这个,并引用它。
  • 您可以将文件数组设置为全局,这样就不需要每次都运行它。

如果您希望将此作为幻灯片放映,直到用户取消它,我建议您使用以下内容:

  • 使用调用方法的计时器对象来增加图像计数,从而更改图片。
  • 不要在GUI上使用thread.sleep,因为它会暂停你的GUI - 这不是一件好事。

如果你想添加下一个/上一个按钮,你需要有一个可以增加/减少的全局索引(比如currentIndex),然后调用代码来设置图像

答案 1 :(得分:1)

您需要进行一些设置,但反对者大多是正确的。对于生产应用程序,这不是一个非常有效的解决方案。话虽如此,我怀疑这是你分发给很多人的东西,所以我们称之为学术练习。如果您只是简单地向应用程序添加资源并将其命名为“ImageResource”(任何名称都可以),并将图像添加到其中,则可以使用以下代码(假设存在相应的UI元素)。

首先,我们创建一个从资源中提取位图的函数。

private Bitmap[] GetResourceImages()
{
    PropertyInfo[] props = typeof(ImageResource).GetProperties(BindingFlags.NonPublic | BindingFlags.Static);
    var images = props.Where(prop => prop.PropertyType == typeof(Bitmap)).Select(prop => prop.GetValue(null, null) as Bitmap).ToArray();

    return images;
}

其次,我们创建了一个基于可用图像随机化图像的函数:

private void RandomizePicture()
{
    Bitmap[] images = GetResourceImages();
    if (images == null || images.Length == 0)
    {
        //Nothing to do here...
        return;
    }

    int maxValue = images.Length;
    Random r = new Random();
    int idx = r.Next(maxValue);
    this.uxStupidPic.Image = images[idx];
}

最后,点击按钮调用该功能:

private void btnRandmoize_Click(object sender, EventArgs e)
{
    this.RandomizePicture();
}

瞧,来自资源文件的随机图像。快乐的编码!

编辑:刚刚注意到你说你使用的是Application资源而不是随机资源文件。只需在GetResourceImages中将“ImageResource”替换为“Properties.Resources”,您就可以开展业务了。

答案 2 :(得分:0)

我喜欢Ryan Ternier的回答非常简单和优雅,我打算发布一个类似于他的解决方案。

我只是想评论为什么行没有/不应该工作的原因:

Image img = Properties.Resources.randomPictureName;

  1. 是因为属性资源正在寻找名为“randomPictureName”的资源而不是实际名称本身。
  2. Properties.Resources对象的工作方式是在代码编译后,它在运行时查找解决方案属性中的所有资源。它不会按你想要的方式工作,因为你试图传入一个甚至可能不存在于资源中的静态变量,强制你将你的方法包装在try / catch语句中以防万一。
  3. http://msdn.microsoft.com/en-us/library/7k989cfy(v=vs.80).aspx