3

我有 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# 的新手。有没有更简单的方法来实现这个结果?例如,不添加图片名称?

更新

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

4

3 回答 3

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),然后调用代码来设置图像

于 2012-07-03T23:24:27.807 回答
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();
}

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

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

于 2012-07-03T23:34:05.810 回答
0

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

我只是想评论一下线路不起作用/不应该起作用的原因:

图片 img = Properties.Resources.randomPictureName;

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

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

于 2012-07-04T00:07:36.610 回答