2013-03-19 13 views
6

Ho codice C# per il recupero di immagini da URL come http://i.imgur.com/QvkaduU.jpg ma come faccio a recuperare l'immagine da pagine Web come questa: http://imgur.com/gallery/QvkaduU?Come ottenere l'immagine di anteprima da una pagina Web

C'è un modo "facile" per farlo o dovrò recuperare l'HTML e costruire un parser C# che guardi in HTML per immagini più grandi di tutte le altre?

Lasciatemi chiarire. Se si incolla http://imgur.com/gallery/QvkaduU (versione HTML) per esempio nel campo di aggiornamento dello stato di Facebook, troverà l'immagine principale e ne farà una miniatura, questo è esattamente il comportamento che sto cercando. La domanda è: come è fatto? Devo scrivere il mio parser HTML o c'è un modo semplice per ottenere questo?

+1

Hai controllato [la loro API] (http://api.imgur.com/)? – Filburt

+0

no, speravo in una soluzione generale non solo per imgurl. – Banshee

+1

Penso che lo screen scraping sia sempre * l'ultima risorsa *. Nella maggior parte dei casi, ciò violerà le condizioni d'uso. – Filburt

risposta

4

Non esiste un modo semplice per ottenere un'immagine di anteprima "buona" per un URL arbitrario.

L'algoritmo di Facebook per farlo è piuttosto complesso. sviluppatori di pagine sono in grado di dare un suggerimento con l'aggiunta di vari meta tag per il <head>, tra cui:

<meta property="og:image" content="http://url_to_your_image_here" /> 

o

<link rel="image_src" href="http://www.code-digital.co.uk/preview.jpg" /> 

(more on this)

... quindi se si voleva replicare l'algoritmo di Facebook, è necessario recuperare l'origine della pagina, analizzarla per eventuali "suggerimenti" come quello sopra (è meglio controllare che non mi sia sfuggito nessun altro formato di "suggerimento") e inventare un fallback algoritmo se la pagina non include uno di quelli .

Una soluzione più realistica sarebbe utilizzare l'URL di qualcun altro -> sistema di anteprima.

Se ti piace la versione di Facebook, penso che dovresti essere in grado di richiedere la miniatura di Facebook per un dato URL tramite la loro API.

Altri servizi che offrono questo genere di cose sono:

0

Puoi provare a fare qualcosa del genere?

public void ProcessRequest(HttpContext context) 
    { 
     { 
      // load here the image 
      .... 
      // and send it to browser 
      ctx.Response.OutputStream.Write(imageData, 0, imageData.Length); 
     } 
    } 

Si può anche provare di cosa stanno parlando qui. Ho provato e ha funzionato come un fascino.

http://www.dotnetspider.com/resources/42565-Download-images-from-URL-using-C.aspx

+1

Questo scaricherà solo l'oggetto che l'URL ti dà, se è solo un'immagine probabilmente funzionerà bene ma se è una pagina HTML che ha più immagini (oltre alla grande immagine principale) ci sarà probabilmente un problema. – Banshee

0

si può provare questo

public Bitmap getImageFromURL(String sURL) 
{ 
    HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(sURL); 
    myRequest.Method = "GET"; 
    HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse(); 
    System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(myResponse.GetResponseStream()); 
    myResponse.Close(); 

    return bmp; 
} 

ottenuto da How to get an image to a pictureBox from an URL? (Windows Mobile)

+1

Questo codice scaricherà solo l'oggetto che l'url ti dà, se la sua immagine funzionerà, ma se la sua pagina HTML non funzionerà. Il mio problema è l'ultimo (pagina HTML che contiene immagini). – Banshee

1

vorrei prendere l'intera sorgente HTML e metti tutti i parametri <img ... src="..."> e le proprietà in linea del cs < ... style="... background-image: ...;"> usando regex e d provare a scaricare tutti i file dietro i collegamenti temporanei. Poi vorrei (provare a convertirlo in Bitmap e) controllare la dimensione dei pixel, l'immagine più grande dovrebbe essere l'immagine che si desidera.

Google potrebbe aiutarti a controllare le dimensioni dei pixel e convertire qualsiasi immagine.

L'espressione regolare per ottenere tutti i link delle immagini provenienti da una sorgente HTML dovrebbero essere

<img[^>]+src=\"([^"]+)\".*?>|<[^>]+style=\"[^"]*background-image:\s*url\(\s*'?([^')])\s*'?)\s*;.*?> (non testato, ma abbastanza sicuro)

Il risultato sarà nel 2 ° o di un indice 3 ° gruppo, inoltre, non fare dimentica di anteporre l'URL corrente ai collegamenti relativi.

1

Sei già sulla strada giusta, sì il modo più affidabile sarebbe quello di recuperare il codice HTML, analizzarlo e cercare le immagini, quindi classificare le immagini in base alla posizione e alle dimensioni. Ad esempio, se la prima immagine che si trova è abbastanza grande da rendere l'anteprima, quindi cool, se comunque è piccola, si passa all'immagine successiva, ecc. Sarebbe molto consigliabile utilizzare un plug-in di immagine come Timthumb (penso Ho visto una versione di ASP.NET qualche volta) e ho memorizzato nella cache le immagini in modo tale che una volta che hai cercato la miniatura per rappresentare un sito web, puoi invece richiamare l'immagine (o le immagini) dal fermo.

Problemi correlati