Случайный просмотр изображений (анимированных) - PullRequest
0 голосов
/ 11 февраля 2009

Я пытался сделать программу, которая показывает картинку в папке. Путь каждого изображения был сохранен в базе данных. Моя проблема заключалась в том, что показывались только последние изображения, хранящиеся в базе данных, а не все изображения.

Код:

Private Sub Form3_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Me.Timer1.Enabled = True

End Sub







Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick




    Try
        Dim ctr As Integer = 0
        Dim pic As String
        Dim sqlconn As New SqlConnection("data source=NMPI_2;initial catalog=IPCS; " & _
                             "password=rhyatco; " & _
                             "persist security info=True; " & _
                             "user id= rhyatco;" & _
                             "packet size=4096")
        sqlconn.Open()
        Dim query As String = "Select picture from Bpicture"
        Dim sqlcomm As New SqlCommand(query, sqlconn)
        Dim reader As SqlDataReader
        reader = sqlcomm.ExecuteReader

        While reader.Read
            pic = reader("picture").ToString
            Me.PictureBox1.Image = Image.FromFile(pic)
            Me.PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage
        End While

    Catch ex As Exception
        MsgBox(ex.Message)
    End Try
End Sub

Ответы [ 3 ]

2 голосов
/ 11 февраля 2009

Всегда будет отображаться последнее изображение, потому что вы извлекаете всю таблицу и извлекаете все записи с помощью цикла While. Последнее изображение всегда будет победителем.

Существует два возможных решения:

Один , случайным образом получить одно изображение из базы данных. Проверьте этот поток stackoverflow о том, как случайным образом выбрать строку. Предостережение с этим решением заключается в том, что вы каждый раз обращаетесь к базе данных.

Два , получить все изображения из базы данных, сохранить данные в коллекции и случайным образом выбрать одно из изображений из коллекции. Предостережение с этим решением - возможно, слишком много изображений для хранения в коллекции в памяти, и в этом случае вы должны использовать One.

0 голосов
/ 11 февраля 2009

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

Я не делал VB, поэтому я пишу код через Google, но вам нужно где-то создать экземпляр Random:

Dim rand as new Random()

Затем в цикле while снимите случайное число, чтобы узнать, стоит ли останавливаться:

While reader.Read
    ...
    If rand.Next(10) > 8 Then
       Exit While
    End If
End While

РЕДАКТИРОВАТЬ: Вы также должны переместить код, чтобы установить Image и SizeMode из цикла while, чтобы они устанавливались только один раз, как только вы определились с изображением.

0 голосов
/ 11 февраля 2009

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

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

Один из способов просто вращать их снова и снова - это загрузить список и заполнить их очередью имен файлов, а затем по таймеру просто сделать что-то вроде этого (извините, мой пример на C #):

string fileName = imageFileNameQueue.Dequeue();
PictureBox1.Image = Image.FromFile(fileName);
imageFileNameQueue.Enqueue (fileName); // Put the file back at the back of the queue
...