从上按一下按钮资源洗牌随机图片(Shuffle random picture from resour

2019-09-19 01:29发布

我有1个图片框,命名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#..有更简单的方法来实现这一结果? 例如,不添加图片的名字呢?

UPDATE

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”的定义

Answer 1:

我不会用系统资源这一点。 他们不是为断开的软件文件系统的维护。

让你的图片为您的应用文件夹中。 他们很容易可以更新这样/改变。 你说:

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),可以增加/减少,然后调用代码来设置图像



Answer 2:

一些设置涉及您的部分,但反对者大多是正确的。 这不是一个生产应用非常有效的解决方案。 话虽这么说,我怀疑这是你分发到成千上万人的东西,所以我们称这种学术活动。 如果你简单地资源添加到您的应用程序并将其命名为“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();
}

瞧,从资源文件随机图像。 编码愉快!

编辑:只注意到你说你使用应用资源,而不是随机的资源文件。 简单地加上“Properties.Resources”替换“ImageResource”,在GetResourceImages,你会在企业。



Answer 3:

我喜欢瑞安Ternier的回答非常简单而优雅,我要张贴与他的相似的解决方案。

我只是想对原因发表评论,为什么行不/不应该工作:

图像IMG = Properties.Resources.randomPictureName;

  1. 就是因为属性的资源正在寻找一个名为“randomPictureName”而不是实际的名称本身的资源。
  2. 在Properties.Resources对象的工作方式是,它会在运行时解决方案的属性所有的资源,之后代码编译。 它不会工作,你想要它,因为你想在可能没有资源,甚至存在一个静态变量传递的方式,迫使你以包裹try / catch语句的方法,以防万一。

http://msdn.microsoft.com/en-us/library/7k989cfy(v=vs.80).aspx



文章来源: Shuffle random picture from resources on button click