Mostrar resultado de www.images.google.com en PictureBox

Iniciado por enterariel, 4 Agosto 2012, 18:36 PM

0 Miembros y 1 Visitante están viendo este tema.

enterariel

Tengo un WebBrowser en donde busca unos imágenes, hay laguna manera de mostrar el resultado de la búsqueda en un lista de PictureBox.

Ejemplo: se busca imagen de Zapatos y que traiga esta forma:


s00rk

Bueno si la pagina de donde sacaras las imagenes es tuya, podrias hacer un codigo donde te retorne en xml los datos con urls de las imagenes y asi sale mas facil parsear el xml y ya cargar las imagenes en una lista de webbrowser de tamaño predeterminado con las imagenes, sino pues te toca parsear el html donde te muestra esas imagenes hehe, bueno es lo unico qe se me ocurre a lo que intentas hacer xP


Keyen Night

#3
Se puede lograr usando un Panel con la propiedad AutoScroll en True, e ir agregando PictureBox con la imagen correspondiente en tiempo de ejecución, los PictureBox podrían tener un tamaño fijo para que se te haga más fácil calcular la posición que tendrán dentro del Panel, puedes usar la propiedad de los PictureBox BackgroundImageLayout en Strech para ajustar la imagen al PictureBox, si quieres que se vea mejor entonces cámbiale el tamaño proporcional con Graphics o con New Bitmap(Imagen , Ancho, Alto).

¿Ya tienes hecho el motor que saca las URL de las imágenes?, si no ya se me dices porque ya encontré una forma ;)
La Fé Mueve Montañas...
                                    ...De Dinero

La programación es más que un trabajo es más que un hobby es una pasión...

enterariel

Keyen Night, no tengo ese motor que saca las url de las imágenes. Lo que si tengo es para cargar en el picuturebox directamente desde na web.


Código (vbnet) [Seleccionar]
Imports System.IO
Imports System.Net
Imports System.Text


Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
    LoadWebImageToPictureBox(PictureBox1, "https://encrypted-tbn0.google.com/images?q=tbn:ANd9GcTtN-EfxQPzx5ZJNoxOgZW14Pnml5-JYaI_ZheLQcBiOPcMqNgP6w")
End Sub

Public Function LoadWebImageToPictureBox(ByVal pb As PictureBox, ByVal ImageURL As String) As Boolean

    Dim objImage As MemoryStream
    Dim objwebClient As WebClient
    Dim sURL As String = Trim(ImageURL)
    Dim bAns As Boolean

    Try

        If Not sURL.ToLower().StartsWith("https://") Then sURL = "https://" & sURL
        objwebClient = New WebClient()

        objImage = New  _
           MemoryStream(objwebClient.DownloadData(sURL))
        pb.Image = Image.FromStream(objImage)
        bAns = True

    Catch ex As Exception
        MsgBox(ex.Message)
        bAns = False
    End Try

    Return bAns

End Function

Keyen Night

Esa función que obtiene una imagen de un URL te ayudara mucho, yo te recomiendo descargar el Source de la búsqueda de Google, el problema es que aún no veo como sacar el link correcto para una búsqueda de "zapato", por ejemplo.

Una simple búsqueda de la palabra "ejemplo", tiene una cantidad enorme de parámetros en el URL >:(

http://www.google.co.ve/search?num=10&hl=es&site=imghp&tbm=isch&source=hp&biw=1360&bih=638&q=ejemplo&oq=ejemplo&gs_l=img.3..0l10.1763.2508.0.2745.7.6.0.1.1.1.391.844.2j2j0j1.5.0...0.0...1ac.3wlEkzZCgp0

Lo que si se es que luego de tener el Source las imágenes vienen en este estilo

imgurl="XXX"&amp

Que se puede capturar con expresiones regulares, para luego ir agregando los PictureBox e ir colocando las imagenes con las URL que sacaste y la función que hiciste.

La otra forma que es el doble de lenta :silbar:, pero más sencilla :xD es cargar la búsqueda en un WebBrowser, y solicitar las etiquetas de las imágenes con Document.Images -> OuterHtml, estas estiquetas vienen en el formato común para agregar una imagen en HTML

<img src=...></img>

También sacarías el link con expresiones regulares y lo cargarías a cada PictureBox, el problema de este método es que cada imagen cargara 2 veces.
La Fé Mueve Montañas...
                                    ...De Dinero

La programación es más que un trabajo es más que un hobby es una pasión...

enterariel

Pude extraer de esta forma todos los link del resultado de la busqueda como a partir de aca sacar solo 10 de los primeros resultados.

el codigo es este:

Código (vbnet) [Seleccionar]
        For Each ele As HtmlElement In WebBrowser1.Document.Links
            Dim eletarget As String = ele.GetAttribute("href")
            ListBox1.Items.Add(eletarget)
        Next

Keyen Night

#7
Con Images se filtra más

Código (vb.net) [Seleccionar]
       For Each ele As HtmlElement In WebBrowser1.Document.Images
           MessageBox.Show(ele.GetAttribute("href"))
       Next


Aquí un ejemplo de lo que te venia hablando, con un Panel1 y un WebBrowser1
Código (vb.net) [Seleccionar]

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        WebBrowser1.Navigate("http://www.google.co.ve")
    End Sub

    Private Sub WebBrowser1_DocumentCompleted(ByVal sender As Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted

        Dim Descarga As New Net.WebClient
        Dim Imagen As Image
        Dim ImagenStream As IO.MemoryStream
        Dim PictureBoxActual As PictureBox

        For Each Elemento As HtmlElement In WebBrowser1.Document.Images

            ImagenStream = New IO.MemoryStream(Descarga.DownloadData(Elemento.GetAttribute("href")))

            Imagen = Image.FromStream(ImagenStream)

            ImagenStream.Dispose()

            PictureBoxActual = New PictureBox() With {.Name = "P" & Panel1.Controls.Count.ToString, _
                                                      .Location = New Point((32 * Panel1.Controls.Count) - (Math.Floor(Panel1.Controls.Count / 3) * 32) * 3, _
                                                                            Math.Floor(Panel1.Controls.Count / 3) * 32), _
                                                      .BackgroundImage = Imagen.Clone, _
                                                      .Size = New Size(32, 32), _
                                                      .BackgroundImageLayout = ImageLayout.Stretch}

            Panel1.Controls.Add(PictureBoxActual)

            Imagen.Dispose()

        Next

    End Sub

End Class


Allí en Size puedes modificar el tamaño de cada Picturebox, y en Location, está calculado para que entren Imágenes de 3 en 3 de izquierda a derecha y de arriba a abajo. Es solo un ejemplo, si quieres que entren Imagenes hasta que cubran el Panel entonces el 3 sería Panel1.Width / 32 o entre la medida que tenga cada PictureBox de ancho.
La Fé Mueve Montañas...
                                    ...De Dinero

La programación es más que un trabajo es más que un hobby es una pasión...

enterariel

Si es la primera pagina funciona de 10, ahora si busco algo y ejecuto ese me tira este error.


Keyen Night

Puede ser que DownloadData no se completo correctamente o que "Elemento" no contenga el atributo href, guarda DownloadData en una variable y verifica que el resultado de GetAttribute no es nulo.
La Fé Mueve Montañas...
                                    ...De Dinero

La programación es más que un trabajo es más que un hobby es una pasión...