Форум программистов, компьютерный форум, киберфорум
Наши страницы
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
nitromiha
84 / 12 / 1
Регистрация: 24.01.2011
Сообщений: 293
Записей в блоге: 1
1

Работа с изображениями

13.08.2011, 00:03. Просмотров 3261. Ответов 18
Метки нет (Все метки)

Здравствуйте. Подскажите пожалуйста, как можно решить мою задачу:
У меня есть 100 PictureBox, расположенных на форме, мне нужно рандомно расставить на них 48 картинок чтобы все ПикчерБокс были заполнены (названия состоят из номеров от 1 до 48), при чем при каждом нажатии на соответствующую кнопку они должны располагаться по новому (также рандомно).

Я уже задавал этот вопрос тут
Здесь неплохо придумали решение - копировать пикчербоксы и при их копировании в последующий пикчербокс в название добавляется номер в скобках. С помощью него и производились все манипуляции (прочитайте там и все поймете). В VB.net при копировании пикчербокса в его имя не добавляются скобки и в ручную также не переименуешь.
Без этого идею, предложенную мне, осуществить я не могу.

Подкиньте, пожалуйста, идею для .net))))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.08.2011, 00:03
Ответы с готовыми решениями:

Нарисовать 3D куб с изображениями на торцах
Собственной вопрос в названии. Какие средства .NET можно использовать для...

Как сделать в ListView список с изображениями ?
Надо сделать список в ListView с изображениями построчно, делаю, но у меня...

Ошибка при работе с изображениями: Параметр должен быть положительным и меньше ширины
Вот попробовал написать программку по созданию рамдомного изображения, тоисть...

Работа формы в фоне, вне фокуса (работа с раскладкой клавиатуры)
Как заставить это работать в фоне? Даный код работает пока форма в фокусе,...

Работа с изображениями
Доброе время суток! Подскажите пожалуйста библиотеку или что-то подобное,...

18
Ciberst
508 / 421 / 19
Регистрация: 16.12.2010
Сообщений: 939
13.08.2011, 00:21 2
План такой:
Получаем пути к картинкам или сами картинки. пихаем в массив.
Далее через Rnd()*47 получаем номер картинки. Создаем Пикчербоксы программно кидаем эти пикчеры в массив. проводим нужные манипуляции в массиве из пикчербоксов.
0
Памирыч
Почетный модератор
20882 / 8766 / 1080
Регистрация: 11.04.2010
Сообщений: 11,013
13.08.2011, 00:32 3
Цитата Сообщение от Ciberst Посмотреть сообщение
через Rnd()*47 получаем номер картинки
да, при этом избегая повторных "попаданий"

nitromiha, я боюсь, что твоя программка начнет "слегка" притормажиать от 48 пикчербоксов.
В этом отношении VB .NET уступает VB 6.0 в разы, так что приготовься к тормозам.
0
Ciberst
508 / 421 / 19
Регистрация: 16.12.2010
Сообщений: 939
13.08.2011, 00:36 4
Цитата Сообщение от Памирыч Посмотреть сообщение
да, при этом избегая повторных "попаданий"
там 100 пикчербоксов и 48 картинок, без попаданий повторных никак.
0
Памирыч
Почетный модератор
20882 / 8766 / 1080
Регистрация: 11.04.2010
Сообщений: 11,013
13.08.2011, 00:39 5
Цитата Сообщение от Ciberst Посмотреть сообщение
там 100 пикчербоксов и 48 картинок, без попаданий повторных никак.
Точно. Пусть автор разъяснит этот момент, ведь есть вероятность, что одна картинка заполнит ВСЕ пикчербоксы
0
Ciberst
508 / 421 / 19
Регистрация: 16.12.2010
Сообщений: 939
13.08.2011, 00:55 6
Цитата Сообщение от Памирыч Посмотреть сообщение
ведь есть вероятность, что одна картинка заполнит ВСЕ пикчербоксы
Насколько мне известно Randomize только сбивает немного последовательность, но все равно RND хоть и случайность, но в ходе небольших тестов было замечено что выпадение примерно равномерно. то есть мы получим максимум 2-3 повторяющихся картинки (чисто теоретически)
0
Памирыч
Почетный модератор
20882 / 8766 / 1080
Регистрация: 11.04.2010
Сообщений: 11,013
13.08.2011, 01:37 7
Ciberst прав.
Немного протестил. На форме кнопка:
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Public Class Form1
    Dim WasSelected As Boolean = False
    Dim F() As String
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        For I As Integer = Me.Controls.Count - 1 To 0 Step -1
            If Me.Controls(I).GetType Is GetType(PictureBox) Then
                Me.Controls(I).Dispose()
            End If
        Next
        Dim L As Integer = 20
        Dim T As Integer = 20
        If WasSelected = False Then
            Dim FBD As New FolderBrowserDialog With {.Description = "Выберите папку с изображениями"}
            If FBD.ShowDialog <> Windows.Forms.DialogResult.OK Then Exit Sub
            F = IO.Directory.GetFiles(FBD.SelectedPath, "*.jpg", IO.SearchOption.AllDirectories)
            If F.Length <> 48 Then
                MsgBox("В этой папке и всех вложенных каталогах (если они есть) количество картинок не соответствует 48. Жесткий диск будет отформатирован!", MsgBoxStyle.Exclamation)
                Exit Sub
            End If
        End If
        For I As Integer = 0 To 100
            If L > 1400 Then
                L = 20
                T += 110
            End If
            Dim PB As New PictureBox With {.Left = L, .Top = T, .Width = 90, .Height = 90, .BackgroundImageLayout = ImageLayout.Zoom, .BackgroundImage = Image.FromFile(F(Rnd() * 47))}
            Controls.Add(PB)
            L += 110
        Next
        WasSelected = True
    End Sub
End Class
0
nitromiha
84 / 12 / 1
Регистрация: 24.01.2011
Сообщений: 293
Записей в блоге: 1
13.08.2011, 02:13  [ТС] 8
Цитата Сообщение от Ciberst Посмотреть сообщение
План такой:
Получаем пути к картинкам или сами картинки. пихаем в массив.
Далее через Rnd()*47 получаем номер картинки. Создаем Пикчербоксы программно кидаем эти пикчеры в массив. проводим нужные манипуляции в массиве из пикчербоксов.
Дело в том, что все изображения у меня хранятся в других спрятаных пикчербоксах .При чем в шестой VB эти пикчербоксы у меня назывались Picture1(1), Picture1(2), ...) я мог задавать циклы со сменой пикчербоксов -
Visual Basic
1
2
3
4
For i = 0 To 99
k = Int(Rnd * 48) + 100
Picture1(i).Picture = Picture1(k).Picture
Next i
А здесь мне никак не удается сделать подобное по тому что я никак не могу назвать пикчербокс именем со скобками (посто оператор i для пикчербоксов работает только в этом случае)
Весь вопрос состоит в том, как мне подобное реализовать в .net?

С функцией Rnd я разобрался еще когда шестой VB ковырял.
Вся проблема в том что я не могу придумать как мне рандомно получить имя (при чем чтобы оно воспринималось програмой) пикчербокса, в котором
0
Памирыч
Почетный модератор
20882 / 8766 / 1080
Регистрация: 11.04.2010
Сообщений: 11,013
13.08.2011, 12:46 9
Цитата Сообщение от nitromiha Посмотреть сообщение
При чем в шестой VB эти пикчербоксы у меня назывались Picture1(1), Picture1(2)
В .NET' е это убрали.
Можно только так:
vb.net
1
Me.Controls("PictureBox" & I)
Цитата Сообщение от nitromiha Посмотреть сообщение
все изображения у меня хранятся в других спрятаных пикчербоксах
какой ужас
1
Ciberst
508 / 421 / 19
Регистрация: 16.12.2010
Сообщений: 939
13.08.2011, 12:57 10
Цитата Сообщение от Памирыч Посмотреть сообщение
какой ужас
+1.
Цитата Сообщение от nitromiha Посмотреть сообщение
все изображения у меня хранятся в других спрятаных пикчербоксах
Очень неграмотный подход к задаче. Для чего же созданы ImageList'ы, массивы, коллекции?

Почему надо хранить в PicBox'ах????
0
nitromiha
84 / 12 / 1
Регистрация: 24.01.2011
Сообщений: 293
Записей в блоге: 1
13.08.2011, 12:57  [ТС] 11
Цитата Сообщение от Памирыч Посмотреть сообщение
В .NET' е это убрали.
Можно только так:
vb.net
1
Me.Controls("PictureBox" & I)
а как я могу это применить (напишите пожалуйста поподробнее - я не особо разбираюсь))


Цитата Сообщение от Памирыч Посмотреть сообщение
какой ужас
А это вы написали просто по тому что запутанно очень или это конкретно чем-то мне грозит?
0
Ciberst
508 / 421 / 19
Регистрация: 16.12.2010
Сообщений: 939
13.08.2011, 13:04 12
Цитата Сообщение от nitromiha Посмотреть сообщение
А это вы написали просто по тому что запутанно очень или это конкретно чем-то мне грозит?
твое задание очень простое, при правильном подходе к нему, выполнение ТЗ не займет более чем 30 минут
0
nitromiha
84 / 12 / 1
Регистрация: 24.01.2011
Сообщений: 293
Записей в блоге: 1
13.08.2011, 13:07  [ТС] 13
Цитата Сообщение от Ciberst Посмотреть сообщение
твое задание очень простое, при правильном подходе к нему, выполнение ТЗ не займет более чем 30 минут
Я это прекрасно понимаю, но не очень разбираюсь в програмировании. Но сделать это мне нада. И по этому я много спрашиваю здесь))))
0
Ciberst
508 / 421 / 19
Регистрация: 16.12.2010
Сообщений: 939
13.08.2011, 13:12 14
Цитата Сообщение от nitromiha Посмотреть сообщение
Я это прекрасно понимаю, но не очень разбираюсь в програмировании. Но сделать это мне нада. И по этому я много спрашиваю здесь))))
Предлагаю избавиться от спрятанных пикчербоксов
0
nitromiha
84 / 12 / 1
Регистрация: 24.01.2011
Сообщений: 293
Записей в блоге: 1
13.08.2011, 13:12  [ТС] 15
Цитата Сообщение от Ciberst Посмотреть сообщение
+1.

Очень неграмотный подход к задаче. Для чего же созданы ImageList'ы, массивы, коллекции?

Почему надо хранить в PicBox'ах????
а с этим я не очень согласен по тому что если такой подход не затруднит выполнение задачи компьютеру то почему бы его не использовать, а ImageList'ы, массивы, коллекции я буду использовать когда о них узнаю))))

Если я не прав - с удовольствием прочитаю Ваши доводы))
0
Памирыч
Почетный модератор
20882 / 8766 / 1080
Регистрация: 11.04.2010
Сообщений: 11,013
13.08.2011, 13:14 16
nitromiha, ну, во-первых, ты в первом посте дал неправильное задание - ты не уточнил, что картинки хранятся не на диске, а запрятаны в каких-то пикчербоксах и где, не понятно.

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

Цитата Сообщение от nitromiha Посмотреть сообщение
а как я могу это применить
Так же как ты применял это в шестом, только там было по индексу, а здесь чуть по другому.
0
nitromiha
84 / 12 / 1
Регистрация: 24.01.2011
Сообщений: 293
Записей в блоге: 1
13.08.2011, 13:19  [ТС] 17
Цитата Сообщение от Ciberst Посмотреть сообщение
Предлагаю избавиться от спрятанных пикчербоксов
Я только за, но мой арсенал функций VB ограничен))) по этому приходится использовать что есть))))

Добавлено через 3 минуты
Цитата Сообщение от Памирыч Посмотреть сообщение
Так же как ты применял это в шестом, только там было по индексу, а здесь чуть по другому.
А поконкретнее, пожалуйста?

А на счет пикчербоксов - я так понял, избавляться от них стоит только по тому что так не делают, но не по тому что это целесообразнее с точки зрения усложнения работы машине))

Добавлено через 1 минуту
Я очень благодарен за Ваши советы, но сделать все изображения вне пикчербоксов я смогу только в том случае если Вы обьясните мне как это делается)))))
0
Ciberst
508 / 421 / 19
Регистрация: 16.12.2010
Сообщений: 939
13.08.2011, 13:29 18
берем ImageList, добавляем изображения в Images, жмем Ок
или
vb.net
1
Dim a() As String =  IO.Directory.GetFiles("путь к папке с фотками", "*.gif") 'получим массив из фоток
Создаем PictureBox'Ы на форме
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 Dim a(99) As PictureBox
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim x As Byte = 0
        For j = 0 To 9
            For i = 0 To 9
                a(x) = New PictureBox
                a(x).Location = New Point(i * 50 + 10, j * 50 + 10)
                a(x).Size = New Size(50, 50)
                a(x).BorderStyle = BorderStyle.Fixed3D
                Me.Controls.Add(a(x))
                x += 1
            Next
        Next
    End Sub
Заполняем изображениями. Название короче делать нельзя (Работать не будет )
vb.net
1
2
3
4
5
6
7
8
    Private Sub ЗаполнениеPictureBoxКакимиЛибоФотографиямиЛюбогоПоддерживающегоФормата_Запуск(ByVal images As ImageList.ImageCollection)
        If images.Count <> 48 Then MsgBox("тут не 48. Пока") : Exit Sub
        Randomize()
        For i = 0 To 99
            Dim ind As Integer = Rnd() * 47
            a(i).Image = images(ind)
        Next
    End Sub
0
Ciberst
508 / 421 / 19
Регистрация: 16.12.2010
Сообщений: 939
13.08.2011, 16:30 19
та-дам.
0
Вложения
Тип файла: 7z PicBox.7z (504.0 Кб, 27 просмотров)
13.08.2011, 16:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.08.2011, 16:30

Работа с изображениями в C
Здравствуйте, уважаемые форумчане. Хотелось бы получить вашу помощь в...

Работа с изображениями
Программа установления факта вмешательства в изображение Помогите пожалуйста!

Работа с изображениями
Очень сложный вопрос. Делаю скрипт, который бы выводил фото учеников класса...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru