2012-07-03 3 views
3

У меня есть 1 коробка с картинками, названная studPic. Я хочу получить, когда я нажимаю кнопку «перетасовать», чтобы получить случайное изображение из ресурсов.Shuffle случайное изображение из ресурсов при нажатии кнопки

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; 

получать сообщение об ошибке Error 1 'Properties.Resources' не содержит определение для 'randomPictureName'

+0

Что ваш ресурс ?? –

+0

@ChrisGessler Ресурсы приложения – heron

+0

@ChrisGessler обновлен. пожалуйста, посмотрите – heron

ответ

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 и ссылайтесь на него.
  • Вы можете поместить файл массива глобальным, чтобы он не запускался каждый раз.

Если вы хотите, чтобы это как слайд-шоу, который работает до тех пор, пока пользователь не отменит его, я бы рекомендовал следующее:

  • использовать объект таймера, который вызывает метод, чтобы увеличить количество изображений, который меняет картину.
  • Не используйте thread.sleep в вашем графическом интерфейсе, так как он приостанавливает ваш графический интерфейс - это нехорошо.

Если вы хотите добавить следующий/предыдущий кнопки, вы должны иметь глобальный индекс (скажем, currentIndex), который может быть увеличено/уменьшено, затем вызвать код, чтобы установить изображение

1

Некоторые установка с вашей стороны, но скептики в основном правы. Это не очень эффективное решение для производственного приложения.Сказав это, я сомневаюсь, что это то, что вы раздаете тоннам людей, поэтому мы назовем это академическим упражнением. Если бы вы просто добавили ресурс в свое приложение и назовете его «ImageResource» (любое имя будет делать) и добавьте к нему свои изображения, вы можете использовать следующий код (при условии, что существуют соответствующие элементы пользовательского интерфейса).

Во-первых, мы создаем функцию для извлечения растровых изображений из вашего ресурса.

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(); 
} 

И вуаля , рандомизированные изображения из файлов ресурсов. Счастливое кодирование!

EDIT: Просто заметили, что вы сказали, что используете ресурс приложения, а не файл случайных ресурсов. Просто замените «ImageResource» на «Properties.Resources», в GetResourceImages, и вы будете в бизнесе.

0

Мне нравится ответ Райана Тернье очень простой и изящный, я собирался опубликовать решение, подобное его.

Я просто хочу, чтобы прокомментировать причины, почему линия не работает/не работает:

Image IMG = Properties.Resources.randomPictureName;

  1. Это потому, что ресурсы ресурсов ищут ресурс, называемый «randomPictureName», а не само фактическое имя.
  2. То, как работает объект Properties.Resources, заключается в том, что он ищет все ресурсы в свойствах вашего решения во время выполнения после компиляции кода. Он не будет работать так, как вы хотите, поскольку вы пытаетесь передать статическую переменную, которая может даже не существовать в ресурсах, заставляя вас на всякий случай обернуть ваш метод вокруг инструкции try/catch.

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

Смежные вопросы